Не удается получить доступ к данным от многих ко многим - PullRequest
0 голосов
/ 08 октября 2019

У меня есть модель Bus and Route, которая пытается получить доступ к маршруту через шину, но получает ошибку

Неопределенное свойство: stdClass :: $ route

Контроллер:

foreach ($Bus as $tBus){

            foreach ($tBus->route as $tBusRoute) {//Undefined property: stdClass::$route
                if($tBusRoute->id == $rId){
                    $BusRouteId = $tBusRoute->pivot->id;            }
            }
            }


Модель шины:

class Bus extends Model
{
    protected $table = 'bus';
    public $primaryKey = 'id';
    public $timestamp = true;


    public function route(){

        return $this->belongsToMany(Route::class , 'bus_route' , 'bus_id' , 'route_id')->withPivot('id');
}

Модель маршрута:

class Route extends Model
{

    protected $table = 'route';
    public $primaryKey = 'id';
    public $timestamp = true;

    public function bus(){

        return $this->belongsToMany(Bus::class , 'bus_route' , 'route_id' , 'bus_id');
    }

Ошибка: неопределенное свойство: stdClass :: $ route

Ответы [ 3 ]

1 голос
/ 08 октября 2019

Вы используете Query Builder напрямую и не используете Eloquent для выполнения запроса.

Для использования модели:

$buses = Bus::where('transport_company_id', $tld)->get();

Query Builder возвращает коллекцию объектов stdClassотсюда твоя ошибка. Если вы выполните запрос через модель, вы получите коллекцию экземпляров модели.

Документы Laravel 6.0 - Eloquent - получение моделей

0 голосов
/ 08 октября 2019

Прежде всего, вы используете Query Builder вместо Eloquent , поэтому ваши объекты не будут приводиться к моделям. Попробуйте вместо этого:

$buses = Bus::where('transport_company_id', $tld)->get();

Затем вы перебираете коллекцию $buses и вызываете отношения, поэтому я предлагаю вам Eager Load этих значений, чтобы избежать N + 1 задача :

$buses = Bus::with('route')->where('transport_company_id', $tld)->get();

PS: Учитывая тот факт, что Bus может иметь много Route с, вы должны переименовать свои отношения во множественное число: routes

В-третьих, вы можете сравнить свои результаты так:

$buses = Bus::with('route')->where('transport_company_id', $tld)->get();

foreach($buses as $bus)
{
    foreach($bus->route as $route)
    {
        // now you can get the $route instance with the pivot data:
        dd($route->pivot->a_pivot_field);
    }
}
0 голосов
/ 08 октября 2019

Лучше использовать Eloquent с отношениями.

$buses = Bus::with('route')->where('transport_company_id',$tId)->get();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...