Laravel привязывает ось к таблице с несколькими значениями

Фон

Я создаю базу данных, вращающуюся вокруг пищевой аллергии, и у меня есть много разных отношений между продуктами и аллергиями. Существует также значение поворота, называемое 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 для каждой аллергии, если это вообще помогает.

Ответ 1

Вы можете.

В этом примере в Документах (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);

Ответ 2

Вы не можете сделать это так, как будто бы вы предлагаете простой цикл:

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

обходной путь Однако, если вы хотите приложить несколько аллергии с единственным уровнем тяжести/идентификатором, вы можете сделать это:

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

Ответ 3

Легче всего подключать дополнительные данные, например:

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

Измените значения тяжести пищевой аллергии, но вы получите подсказку...: -)