无法从多对多关系访问数据

时间:2019-10-08 17:35:44

标签: laravel model many-to-many

我的公交和路线模型试图通过公交访问路线,但出现错误

  

未定义的属性: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 个答案:

答案 0 :(得分:1)

您直接使用查询生成器,而不是通过Eloquent进行查询。

使用模型:

a

查询生成器返回$buses = Bus::where('transport_company_id', $tld)->get(); 对象的集合,因此会出现错误。如果通过模型查询,将获得模型实例的集合。

Laravel 6.0 Docs - Eloquent - Retrieving Models

答案 1 :(得分:0)

更好地与关系使用口才。

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

答案 2 :(得分:0)

首先,您使用的是Query Builder而不是Eloquent,因此您的对象将不会被投射到模型上。尝试以下方法:

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

然后,您正在遍历$buses集合并调用该关系,因此建议您Eager Load这个值以避免N+1 problem

$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);
    }
}