首页 文章

Laravel将数据库附加到具有多个值的表

提问于
浏览
12

背景

我正在创建一个围绕食物过敏的数据库,我在食物和过敏之间有很多关系 . 还有一个名为 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 .

3 回答

  • 20

    最简单的是附加额外的数据,如下:

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

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

  • 0

    您可以 .

    从Docs中的这个示例(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);
    
  • 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));
    

相关问题