laravel5.1使用eloquent hasOne()检索嵌套关系(一对一关系)

时间:2016-01-20 18:31:15

标签: php eloquent laravel-5.1 relationship one-to-one

我的桌面设计是:

users: | id  |username | ... |

tickets: | id | supp_id | ... |

ticket_replies: | id | ticket_id | user_id |

我的控制器看起来像:

用户:

public function tickets()
{
    return $this->hasMany('App\ticket');
}

票:

public function ticket_replie()
{
    return $this->hasMany('App\ticket_replie');
}

public function supporter()
{
    return $this->hasOne('App\User', 'id','supp_id');
}

我的控制器看起来像这样:

$tickets =  Auth::user()->tickets()->orderBy('status', 'desc')->paginate(2);

return view('protected.ticketsList', [ 
    'tickets' => $tickets,
]);

在我看来,我使用:

 supporter: {{ $ticket['supporter']->username }}

知道我哪里做错了吗?我总是得到这个错误:

  

尝试获取非对象的属性

在我看来,表本身之间的关系是正确完成的。 当我在我的视图中使用例如{{ dd($ticket) }}时,我得到一个包含我需要的所有项目的对象:

image

1 个答案:

答案 0 :(得分:1)

首先,尝试访问public function supporter()模型上的函数Ticket无法使用数组语法完成。变化:

{{ $ticket['supporter']->username }}

为:

{{ $ticket->supporter()->first()->username }}

如果您不想使用->first(),您可以执行以下两项操作之一。修改现有查询以包含->with("supporter")语法:

$tickets = Auth::user()
           ->tickets()
           ->with("supporter")
           ->orderBy('status', 'desc')
           ->paginate(2);

从视图中访问支持者:

{{ $ticket->supporter->username }}
// Notice how supporter is no longer a `method` ->supporter() but a `property` ->supporter

或者您可以修改您的关系以包含更近的->first()

public function supporter(){
    return $this->hasOne('App\User', 'id','supp_id')->first();
}

然后像这样访问它:

{{ $ticket->supporter()->username }}
// Notice you no longer need `->first()`

因此,正如您所看到的,有多种方法可以访问Ticket的{​​{1}}。请注意,您无法真正结合这些选项;修改函数以包含Supporter,然后尝试使用->first()将返回错误,因此请选择其中一个。

希望有所帮助!