Laravel dołącza pivot do tabeli z wieloma wartościami
Tło
Tworzę bazę danych obracającą się wokół alergii pokarmowych i mam wiele do wielu relacji między pokarmem a alergią. Istnieje również wartość pivot o nazwie severity
, która ma liczbę liczbową reprezentującą nasilenie alergii na dany produkt spożywczy.
Tabela linków wygląda tak;
food_id|allergy_id|severity
-------|----------|--------
1 | 1 | 3
1 | 4 | 1
2 | 2 | 1
Problem
Podczas próby aktualizacji tabeli łącza za pomocą Eloquent (gdzie $allergy_ids
jest tablicą)
$food->allergies()->attach($allergy_ids);
Jak mam dodać wiele wartości do tej tabeli przestawnej jednocześnie wraz z wartościami przestawnymi?
Mogę dodać wszystkie allergy_id
' s dla konkretnego artykułu spożywczego za jednym razem, używając powyższej linii, ale jak Mogę również dodać w kolumnie severity
w tym samym czasie z tablicą różnych wartości dotkliwości? Może coś w stylu
$food->allergies()->attach($allergy_ids, $severity_ids);
Edit: może występować między 0-20 alergii na konkretny produkt spożywczy, a ocena ciężkości od 0-4 dla każdej alergii, jeśli to w ogóle pomaga.
3 answers
Możesz.
Z tego przykładu w dokumentach (4.2, 5.0):
$user->roles()->sync(array(1 => array('expires' => true)));
Wersja na twardo dla dwóch pierwszych wierszy:
$food = Food::find(1);
$food->allergies()->sync([1 => ['severity' => 3], 4 => ['severity' => 1]]);
Dynamicznie, z tablicami $allergy_ids i $severities w zgodnym stanie (rozmiar i sortowanie), należy wcześniej przygotować dane synchronizacji. Coś w stylu:
$sync_data = [];
for($i = 0; $i < count($allergy_ids); $i++))
$sync_data[$allergy_ids[$i]] = ['severity' => $severities[$i]];
$food->allergies()->sync($sync_data);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-20 13:38:39
You can 't do it like you' like so I suggest a simple loop:
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()
}
Obejście Jednak jeśli chcesz dołączyć wiele alergii z pojedynczym poziomem nasilenia / id, możesz to zrobić:
$food->allergies()->attach($allergy_ids, array('severity' => $singleSeverityValue));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-22 18:43:16
Najłatwiej jest załączyć dodatkowe dane, w ten sposób:
$retailer->paymentmethods()->attach($paymentmethod, array('currency' => $paymentmethod->currency));
Zmień wartości dla ciężkości alergii pokarmowej, ale dostaniesz podpowiedź... :-)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-18 08:09:58