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

时间:2014-04-22 17:51:56

标签: laravel laravel-4 eloquent pivot-table

背景

我正在创建一个围绕食物过敏的数据库,我在食物和过敏之间存在多种关系。还有一个名为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个过敏,如果这有帮助,每个过敏的严重等级为0-4。

5 个答案:

答案 0 :(得分:23)

你可以。

来自文档中的此示例(4.25.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);

答案 1 :(得分:9)

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

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));

答案 2 :(得分:0)

最容易附加额外数据,如下:

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

更改食物过敏严重程度的值,但您得到提示......: - )

答案 3 :(得分:0)

要将用户分配给特定角色,请执行以下操作。

$user = App\User::find(1);
$user->roles()->attach($roleId);

希望这会有所帮助

答案 4 :(得分:0)

从Laravel 5.1版本(当前在 Laravel 8.x 中)开始,可以将数组作为第二个参数传递,并带有需要保存在中间表中的所有其他参数。 您可以read in the documentation

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

$user->roles()->attach($roleId, ['expires' => $expires]);

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

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

那你就可以做

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