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.

Author: Duncan Ogle, 2014-04-22

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);
 20
Author: Nuno Rafael Figueiredo,
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));
 9
Author: Jarek Tkaczyk,
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ź... :-)

 0
Author: My Brain,
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