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

时间:2016-05-13 12:33:28

标签: php laravel laravel-5 eloquent laravel-5.2

我有两个模型,它们之间定义了多对多关系: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]); 

2 个答案:

答案 0 :(得分:1)

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

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

<select id="number" name="number_towers">
<option hidden value=""></option>
<option value="1">1 tower</option>
<option value="2">2 towers</option>
<option value="3">3 towers</option>
</select>

<div id="1tower" style="display: none;">
A Tower Value 1: <input type ="text" name = "curent_nominal_sec1"/><br>
B Tower Value 1: <input type ="text" name = "putere_sec1"/><br>
C Tower Value 1: <input type ="text" name = "clasa_precizie_sec1"/></div>

<div id="2tower" style="display: none;">
A Tower Value 2: <input type ="text" name = "curent_nominal_sec2"/><br>
B Tower Value 2: <input type ="text" name = "putere_sec2"/><br>
C Tower Value 2: <input type ="text" name = "clasa_precizie_sec2"/></div>

<div id="3tower" style="display: none;">
A Tower Value 3: <input type ="text" name = "curent_nominal_sec3"/><br>
B Tower Value 3: <input type ="text" name = "putere_sec3"/><br>
C Tower Value 3: <input type ="text" name = "clasa_precizie_sec3"/></div>

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

更新所有相关枢轴行的最有效方法是直接对该表进行操作:

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

答案 1 :(得分: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