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));
Измените значения тяжести пищевой аллергии, но вы получите подсказку...: -)