Laravel将pivot附加到具有多个值的表

mo49yndu  于 2023-06-24  发布在  其他
关注(0)|答案(5)|浏览(121)

后台

我正在创建一个围绕食物过敏的数据库,我有食物和过敏之间的许多关系。还有一个称为severity的枢轴值,它具有表示该食物项的过敏严重程度的数字。
这个链接表看起来像这样;

food_id|allergy_id|severity
-------|----------|--------
     1 |        1 |      3
     1 |        4 |      1
     2 |        2 |      1

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

$food->allergies()->attach($allergy_ids);

我如何将多个值与透视值同时添加到这个透视表中呢?
我可以使用上面的行一次性添加一个特定食物的所有allergy_id,但是我如何同时添加severity列中的各种严重度值?也许是

$food->allergies()->attach($allergy_ids, $severity_ids);

编辑:对于一种特定的食物,可能会有0 - 20种过敏React,每种过敏React的严重程度等级为0 - 4,如果这有帮助的话。

jgwigjjp

jgwigjjp1#

你可以的
从Docs(4.2,5.0)中的这个例子:

$user->roles()->sync(array(1 => array('expires' => true)));

前两行的硬编码版本:

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

动态地,当你的数组$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);
rxztt3cl

rxztt3cl2#

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

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()
}

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

$food->allergies()->attach($allergy_ids, array('severity' => $singleSeverityValue));
x759pob2

x759pob23#

从Laravel的5.1版本(目前在Laravel 10.x中)开始,可以将数组作为第二个参数传递,并将所有需要保存在中间表中的附加参数保存在中间表中。正如您在文档中看到的

  • 当将关系附加到模型时,您还可以传递一个要插入到中间表中的附加数据数组:*
$user->roles()->attach($roleId, ['expires' => $expires]);

为方便起见,attach和detach也接受ID数组作为输入:

$user->roles()->attach([1 => ['expires' => $expires], 2, 3]);

那么你可以简单地做

$food->allergies()->attach([1 => ['severity' => 3], 4 => ['severity' => 1]]);
pdsfdshx

pdsfdshx4#

所以,在Laravel 9上,在数组中传递id对我很有效。像这样
$user->roles()->attach([$a->id,$b->id,$c->id]);等等。
我猜不是传递字符串。我们可以只传递id或者将字符串转换为数组。

du7egjpx

du7egjpx5#

最简单的方法是附加额外的数据,如下所示:

$retailer->paymentmethods()->attach($paymentmethod, array('currency' => $paymentmethod->currency));

改变食物过敏严重程度的数值,但你会得到提示……:—)

相关问题