Laravel使用多个值将pivot附加到表

Dun*_*gle 16 pivot-table laravel eloquent laravel-4

背景

我正在创建一个围绕食物过敏的数据库,我在食物和过敏之间有很多关系.还有一个名为的枢轴值severity,其具有表示该食品过敏严重程度的数字.

这个链接表看起来像这样;

food_id|allergy_id|severity
-------|----------|--------
     1 |        1 |      3
     1 |        4 |      1
     2 |        2 |      1
Run Code Online (Sandbox Code Playgroud)

问题

尝试使用Eloquent更新链接表时(其中$allergy_ids是数组)

$food->allergies()->attach($allergy_ids);
Run Code Online (Sandbox Code Playgroud)

如何将此多个值与枢轴值一起添加到此数据透视表?

我可以allergy_id使用上面的行一次性添加特定食品的所有食品,但是我如何severity同时使用各种严重性值的数组添加列?也许是这样的

$food->allergies()->attach($allergy_ids, $severity_ids);
Run Code Online (Sandbox Code Playgroud)

编辑:对于特定食品,可能有0-20个过敏,如果这有帮助,每个过敏的严重等级为0-4.

Nun*_*edo 25

您可以.

从这个例子中的文档(4.2,5.0):

$user->roles()->sync(array(1 => array('expires' => true)));
Run Code Online (Sandbox Code Playgroud)

前两行的硬编码版本:

$food = Food::find(1);
$food->allergies()->sync([1 => ['severity' => 3], 4 => ['severity' => 1]]);
Run Code Online (Sandbox Code Playgroud)

动态地,您的阵列$ allergy_ids和$ severities处于兼容状态(大小和排序),您应该在之前准备同步数据.就像是:

$sync_data = [];
for($i = 0; $i < count($allergy_ids); $i++))
    $sync_data[$allergy_ids[$i]] = ['severity' => $severities[$i]];

$food->allergies()->sync($sync_data);
Run Code Online (Sandbox Code Playgroud)

  • 适用于"附加".注意!!!使用sync将删除`$ sync_data`中不存在的所有内容,并添加表中不存在的内容.它相当于`detach()`然后`attach()`.注意完全相同,但关闭,因为exisitng记录不会首先分离. (3认同)

MrE*_*uar 19

从 Laravel 5.1 版本(当前为Laravel 10.x)开始,可以将数组作为第二个参数传递,其中包含需要保存在中间表中的所有附加参数。正如您可以在文档中阅读的那样

将关系附加到模型时,您还可以传递要插入到中间表中的附加数据数组:

$user->roles()->attach($roleId, ['expires' => $expires]);
Run Code Online (Sandbox Code Playgroud)

为了方便起见,附加和分离还接受 ID 数组作为输入:

$user->roles()->attach([1 => ['expires' => $expires], 2, 3]);
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地做

$food->allergies()->attach([1 => ['severity' => 3], 4 => ['severity' => 1]]);
Run Code Online (Sandbox Code Playgroud)


Jar*_*zyk 10

你不能像你这样做,所以我建议一个简单的循环:

foreach ($allergy_ids as $key => $id)
{
  $food->allergies()->attach($id, array_get($severity_ids, $key));
  // should you need a sensible default pass it as a 3rd parameter to the array_get()
}
Run Code Online (Sandbox Code Playgroud)

解决方法但是,如果您想要附加具有单一严重性级别/ ID的多个过敏症,那么您可以这样做:

$food->allergies()->attach($allergy_ids, array('severity' => $singleSeverityValue));
Run Code Online (Sandbox Code Playgroud)