如何使用Eloquent批量选择仅数据透视表?

3

我有两个模型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]); 

1
什么是数据透视表?你只有一个数据透视表。你想要实现什么目标? - Alexey Mezenin
我想选择数据透视表的所有记录。 - Alex Lomia
你只需要ID还是也需要用户和文章模型的集合? - Alexey Mezenin
我需要属于这个特定用户的所有透视记录。这样说通吗? - Alex Lomia
2个回答

1
你的问题不是很清楚,我不确定你真正需要什么,请提供更多细节。
来自“数据透视表”的数据在相关模型的$pivot属性中可用,因此您可以使用以下方法访问它:
foreach ($user->posts as $post) {
  echo $post->pivot->someFieldFromPivotData;
}

您可以在文档中找到有关如何使用数据透视表的更多信息:https://laravel.com/docs/5.1/eloquent-relationships#many-to-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'); 

1
我想在一个 SQL 查询中批量更新数据透视记录。逐个迭代它们将是低效的。 - Alex Lomia
例如:times_seen 字段 - Alex Lomia
2
是的,那正是我想要的。你今天已经完美地第三次回答了我的问题,非常感谢 :) - Alex Lomia

1

透视表通常只有两个用于连接两个模型的外键。如果您需要获取特定用户的所有帖子,可以使用$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-many-to-many-relationships


谢谢您的回答,但那不是我要找的。我想要的是,例如,更新每个数据透视表的times_seen字段。 - Alex Lomia
点击我的回答中的链接。你可以使用 $user->roles()->attach([1 => ['expires' => $expires], 2, 3]);,我猜这正是你想要的。 - Alexey Mezenin
抱歉,我想我的问题表述得不够清楚。感谢您的时间。 - Alex Lomia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接