我的用户和通知 Eloquent模型上设置了多对多关系。这样我就可以访问数据透视表 - user_notifications - 如下所示:
$user = User::find(1);
foreach ($user->notifications() as $n) {
echo $n->pivot->created_at;
}
对于ID = 1的用户,这将为数据透视表中的所有created_at
字段值提供。
如果我需要只有一个支点行,请说明 notification_id = 2 ?有没有办法将pivot
与where
或has
合并?可以在没有循环$user->notifications()
的情况下完成吗?
答案 0 :(得分:8)
您可以在关系中使用where
子句:
$notification = $user->notifications()->where('notification_id', 2)->first();
echo $notification->pivot->created_at;
答案 1 :(得分:5)
您也可以直接使用find
方法。
$notification = $user->notifications()->find(2);
echo $notification->pivot->created_at;
答案 2 :(得分:0)
我一直在处理这个问题,并且lukasgeiter的答案很好,直到你想通过 id 找到一个支点行的奇怪情况(如果你设置了一个数据透视表上的$table->increments('id')
列。我有时会这样做,但更好的解决方案是使用专用的关系模型(定义自定义中间表模型 @ https://laravel.com/docs/5.6/eloquent-relationships)< / p>
在这个奇怪的案例中你可以做些什么:
$notification = $user->notifications()->having('pivot_id', 2)->first();
echo $notification->pivot->created_at;
您必须在模型中的关系方法中加入withPivot('id')
。即。
function notifications() {
return $this->belongsToMany('App\Notification')->withPivot('id');
}