Laravel - свойства не существуют в этом экземпляре коллекции - PullRequest
0 голосов
/ 31 марта 2020

Итак, у меня есть небольшой Laravel автомобильный проект, и у меня есть две отдельные таблицы, таблица автомобилей и таблица vehicle_infos. Вот моя 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);
    }
}

Итак, моя car_id из vehicle_infos таблица взята из public function store() из CarsController, и она автоматически сохраняет новые данные в vehicle_infos, и это нормально.

Но когда я делаю php artisan tinker, чтобы проверить мои отношения, это показывает мне ошибку. Итак, вот что я делаю в php artisan tinker:

Первый шаг: $car = App\Car::find(4);, и он показывает мне все данные для этого автомобиля, затем $car->vehicleinfo, и он показывает мне все данные из таблицы vehicle_infos с car_id из 4.

Но когда я, например, $car->vehicleinfo->urban, это показывает мне эту ошибку Exception with message 'Property [urban] does not exist on this collection instance.'. Что я делаю не так? Пожалуйста, помогите мне это расстраивает.

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Исходя из структуры вашей модели, 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 Коллекции для дополнительных методов.

1 голос
/ 31 марта 2020

Здравствуйте, вы можете попробовать заменить find() на find()->first() или заменить $car->vehicleinfo->urban на $car->vehicleinfo[´urban’]

И мои глаза видят, что эта строка urban прокомментирована - это нормально коллекция экземпляров urban не существует, если вы pu sh данные с комментарием строки. Обычно sql будет ли вам золото, вам городская колонна требуется?

В этой строке есть комментарий для urban `

    $vehicleinfo = new VehicleInfo;
    //$vehicleinfo->urban = "Urban";
    $vehicleinfo->car_id = $car->id;
    $vehicleinfo->save(); `
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...