如何使用Eloquent只批量选择透视表


How to bulk-select only pivot tables using Eloquent?

我有两个模型,它们之间定义了多对多关系:UserPost。我需要访问所有用户帖子的透视表记录。我怎样才能做到这一点?例如:

$user->posts()->pivot()->get(); // I need to do something like this

我之所以需要这样做,是为了在这些枢轴上的一个查询中执行批量更新。示例:

// set 'times_seen' to 100 for all of the pivot records
$user->posts()->pivot()->update(['times_seen' => 100]); 

您的问题不是很清楚,我不确定您真正需要什么,所以请提供更多详细信息。

pivot表中的数据在相关模型的$pivot属性中可用,因此您可以使用以下方法访问它:

foreach ($user->posts as $post) {
  echo $post->pivot->someFieldFromPivotData;
}

您可以在文档中找到有关如何使用透视表的更多信息:https://laravel.com/docs/5.1/eloquent-relationships#many-到许多

更新所有相关数据透视行的最有效方法是直接对该表进行操作:

// to set to fixed value
DB::table('pivot_table_name')->where('user_id', $user->id)->update(['times_seen' => 1]); 
// to increment by one
DB::table('pivot_table_name')->where('user_id', $user->id)->increment('times_seen'); 

pivot表通常只有两个外键用于连接两个模型。如果你需要获取指定用户的所有帖子,你可以用$user->posts()来完成。

我想在一个sql查询中批量更新数据透视记录。遍历其中的每一个都是低效的

如果理解正确,您希望将attach()detach()sync()与数组一起使用:

$user->roles()->detach([1, 2, 3]);
$user->roles()->attach([1, 2, 3]);
$user->roles()->sync([1, 2, 3]);

https://laravel.com/docs/5.1/eloquent-relationships#inserting-多对多关系