Laravel - 属性 在此集合实例上不存在

Laravel - propery does not exist on this collection instance

所以我有一个小型 Laravel 汽车项目,我有两个独立的 table,汽车 table 和 vehicle_infos table。 这是我的 CarsController@store:

public function store(Request $request)
    {
        $this->validate($request, [
            'naslov' => 'required',
            'marka' => 'required',
            'model' => 'required',
            /*
            'kubikaza' => 'required',
            'zamajac' => 'required',
            'potrosnja' => 'required',
            'karoserija' => 'required',
            'kilometraza' => 'required',
            'godiste' => 'required',
            'gorivo' => 'required',
            'vlasnistvo' => 'required',
            'kilovata' => 'required',
            'konjska_snaga' => 'required',
            'emisiona_klasa' => 'required',
            'pogon' => 'required',
            'mjenjac' => 'required',
            'br_brzina_mjenjaca' => 'required',
            'velicina_felni' => 'required',
            'posjeduje_gume' => 'required',
            'br_vrata' => 'required',
            'br_sjedista' => 'required',
            'str_volana' => 'required',
            'klima' => 'required',
            'boja_spolj' => 'required',
            'boja_unutrasnj' => 'required',
            'materijal_unutrasnj' => 'required',
            'registracija' => 'required',
            'ostecenje' => 'required',
            'zamjena' => 'required',
            'sigurnost' => 'required',
            'oprema' => 'required',
            'stanje' => 'required',
            'nacin_finansiranja' => 'required',
            'nacin_prodaje' => 'required',
            'cijena' => 'required',
            'vrsta_cijene' => 'required',
            'opis_oglasa' => 'required',
            //'fotografije' => 'required',
            //'kontakt' => 'required',
            */
        ]);

        /*
        // Handle File Upload
        if($request->hasFile('fotografije')){
            // Get filename with the extension
            $filenameWithExt = $request->file('fotografije')->getClientOriginalName();
            // Get just filename
            $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);
            // Get just ext
            $extension = $request->file('fotografije')->getClientOriginalExtension();
            // Filename to store
            $fileNameToStore= $filename.'_'.time().'.'.$extension;
            // Upload Image
            $path = $request->file('fotografije')->storeAs('public/slike_oglasa', $fileNameToStore);
        } else {
            $fileNameToStore = 'noimage.jpg';
        }
        */

        $images=array();
        if($files=$request->file('fotografije')){
            foreach($files as $file){
                $name=$file->getClientOriginalName();
                $file->move('slike_oglasa',$name);
                $images[]=$name;
            }
        }

        $car = new Car;
        $car->naslov = $request->input('naslov');
        $car->marka = $request->input('marka');
        $car->model = $request->input('model');
        $car->kubikaza = $request->input('kubikaza');
        $car->zamajac = $request->input('zamajac');
        //$car->potrosnja = $request->input('potrosnja');
        $car->karoserija = $request->input('karoserija');
        $car->godiste = $request->input('godiste');
        $car->kilometraza = $request->input('kilometraza');
        $car->gorivo = $request->input('gorivo');
        $car->vlasnistvo = $request->input('vlasnistvo');
        $car->kilovata = $request->input('kilovata');
        $car->konjska_snaga = $request->input('konjska_snaga');
        $car->emisiona_klasa = $request->input('emisiona_klasa');
        $car->pogon = $request->input('pogon');
        $car->mjenjac = $request->input('mjenjac');
        $car->br_brzina_mjenjaca = $request->input('br_brzina_mjenjaca');
        $car->velicina_felni = $request->input('velicina_felni');
        $car->posjeduje_gume = $request->input('posjeduje_gume');
        $car->br_vrata = $request->input('br_vrata');
        $car->br_sjedista = $request->input('br_sjedista');
        $car->str_volana = $request->input('str_volana');
        $car->klima = $request->input('klima');
        $car->boja_spolj = $request->input('boja_spolj');
        $car->boja_unutrasnj = $request->input('boja_unutrasnj');
        $car->materijal_unutrasnj = $request->input('materijal_unutrasnj');
        $car->registracija = $request->input('registracija');
        $car->ostecenje = $request->input('ostecenje');
        $car->zamjena = $request->input('zamjena');
        $car->sigurnost = implode(',', $request->input('sigurnost'));
        $car->oprema = implode(',', $request->input('oprema'));
        $car->stanje = implode(',', $request->input('stanje'));
        $car->nacin_finansiranja = $request->input('nacin_finansiranja');
        $car->nacin_prodaje = $request->input('nacin_prodaje');
        $car->cijena = $request->input('cijena');
        $car->vrsta_cijene = $request->input('vrsta_cijene');
        $car->opis_oglasa = $request->input('opis_oglasa');
        //$car->user_id = 1;
        $car->user_id = auth()->user()->id;
        $car->fotografije =  implode("|", $images);
        $car->trajanje_oglasa = $request->input('trajanje_oglasa');
        $car->placeni_status = $request->input('placeni_status');

        if($car->trajanje_oglasa == 30){
            $car->to_datum_isteka = Carbon::now()->addDays(30);
        } else {
            $car->to_datum_isteka = Carbon::now()->addDays(60);
        }

        if($car->placeni_status == 0){
            $car->po_datum_isteka = Carbon::now();
        } else if($car->placeni_status == 1) {
            $car->po_datum_isteka = Carbon::now()->addDays(7);
        } else if($car->placeni_status == 2) {
            $car->po_datum_isteka = Carbon::now()->addDays(14);
        } else if($car->placeni_status == 3) {
            $car->po_datum_isteka = Carbon::now()->addDays(21);
        }
        //$car->kontakt = $request->input('kontakt');
        $car->save();

        $vehicleinfo = new VehicleInfo;
        //$vehicleinfo->urban = "Urban";
        $vehicleinfo->car_id = $car->id;
        $vehicleinfo->save();

        //ukupno oglasa od strane usera, skladistenje u ads table
        $ad = new Ad;
        $ad->car_id = $car->id;
        //$ad->user_id = 1;
        $ad->user_id = auth()->user()->id;
        $ad->save();

        return redirect('/cars');
}

我的模型Car.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\User;

class Car extends Model
{

    protected $table = "cars";
    protected $primaryKey = "id";

    protected $fillable = [
        'naslov', 'marka', 'model', 'kubikaza', 'zamajac', 'karoserija', 'godiste', 'kilometraza', 'br_brzina_mjenjaca',
        'gorivo', 'vlasnistvo', 'kilovata', 'konjska_snaga', 'emisiona_klasa', 'pogon', 'mjenjac', 'br_vrata', 'velicina_felni', 'posjeduje_gume',
        'br_sjedista', 'str_volana', 'klima', 'boja_spolj', 'boja_unutrasnj', 'materijal_unutrasnj', 'registracija', 'ostecenje',
        'zamjena', 'sigurnost', 'oprema', 'stanje', 'nacin_finansiranja', 'nacin_prodaje', 'cijena', 'vrsta_cijene', 'opis_oglasa', 'fotografije'
    ];

    public function user(){
        return $this->belongsTo(User::class);
    }

    public function vehicleinfo(){
        return $this->hasMany(VehicleInfo::class);
    }

    public function ad(){
        return $this->hasMany(Ad::class);
    }
}

我的模型VehicleInfo.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class VehicleInfo extends Model
{
    protected $table = 'vehicle_infos';
    protected $primaryKey = 'id';

    protected $fillable = ['car_id', 'urban', 'extra_urban', 'combined', 'length', 'width', 'height'];

    public function car(){
      return $this->belongsTo(Car::class);
    }
}

所以我来自 vehicle_infos table 的 car_id 来自 CarsControllerpublic function store() 并且它自动将新数据存储在 vehicle_infos没关系。

但是当我php artisan tinker检查我的关系时,它显示错误。所以这就是我在 php artisan tinker:

中所做的

第一步:$car = App\Car::find(4); 它显示了那辆车的所有数据,然后 $car->vehicleinfo 它显示了 vehicle_infos table 和 [=18] 的所有数据=] 4.

但是当我执行 $car->vehicleinfo->urban 时,例如,它向我显示此错误 Exception with message 'Property [urban] does not exist on this collection instance.'。我做错了什么?请帮助我它令人沮丧。

您好,您可以尝试将 find() 替换为 find()->first() 或将 $car->vehicleinfo->urban 替换为 $car->vehicleinfo[´urban’]

我的眼睛看到这条线 urban 被评论是正常的如果你用评论的行推送数据,实例 urban 的集合不存在。通常 sql 是否需要 gold you you're column urban ?

这一行有 urban 的评论 `

    $vehicleinfo = new VehicleInfo;
    //$vehicleinfo->urban = "Urban";
    $vehicleinfo->car_id = $car->id;
    $vehicleinfo->save(); `

根据你的模型结构,cars有很多vehicleinfo。做 $cars->vehicleinfo 会给你一个 collection 实例,因为它 hasMany 。执行 $car->vehicleinfo->urban 将不起作用,因为 collection 实例上没有 urban 属性。

尝试做:

$cars->vehicleinfo->first()->urban;

或者如果你想要所有相关车辆信息的所有城市属性:

$cars->vehicleinfo->pluck('urban') // returns an array of all the urban properties found

有关更多方法,请参阅 Laravel Collections