Laravel: 如何通过键 id 获取单个数据透视行

Laravel: How to get single pivot row by key id

我在 UserNotification Eloquent 模型上设置了多对多关系。这样我就可以访问枢轴 table - user_notifications - 如下所示:

$user = User::find(1);
foreach ($user->notifications() as $n) {
    echo $n->pivot->created_at;
}

这将为 ID = 1 的用户提供数据透视表 table 中的所有 created_at 字段值。

如果我只需要 一个 主元行怎么办,比如说 notification_id = 2?有没有办法将 pivotwherehas 结合起来?不循环$user->notifications()可以吗?

您可以在关系上使用 where 子句:

$notification = $user->notifications()->where('notification_id', 2)->first();
echo $notification->pivot->created_at;

也可以直接使用find方法。

$notification = $user->notifications()->find(2);
echo $notification->pivot->created_at;

我一直在处理这个问题,lukasgeiter 的回答很好,直到你想通过 id 找到一个数据透视行的奇怪情况(如果你设置了 $table->increments('id') 数据透视表上的列 table。我有时会这样做,但更好的解决方案是为关系使用专用模型(定义自定义中间 Table 模型@https://laravel.com/docs/5.6/eloquent-relationships)

在这种奇怪的情况下你可以做什么:

$notification = $user->notifications()->having('pivot_id', 2)->first();
echo $notification->pivot->created_at;

您必须在模型的关系方法中包含 withPivot('id')。即

function notifications() {
    return $this->belongsToMany('App\Notification')->withPivot('id');
}