web-dev-qa-db-fra.com

Laravel attachez le pivot à la table avec plusieurs valeurs

Contexte

Je crée une base de données sur les allergies alimentaires et j'ai de nombreuses relations entre aliments et allergies. Il existe également une valeur de pivot appelée severity qui porte un nombre représentant la sévérité de l'allergie pour cet aliment.

Cette table de liens ressemble à ceci;

food_id|allergy_id|severity
-------|----------|--------
     1 |        1 |      3
     1 |        4 |      1
     2 |        2 |      1

Le problème

Lorsque vous essayez de mettre à jour la table des liens avec Eloquent (où $allergy_ids est un tableau)

$food->allergies()->attach($allergy_ids);

Comment pourrais-je ajouter plusieurs valeurs à ce tableau croisé en même temps que les valeurs de pivot?

Je peux ajouter tous les allergy_id d'un aliment en une fois en utilisant la ligne ci-dessus, mais comment puis-je également ajouter simultanément dans la colonne severity avec un tableau de valeurs de gravité différentes? Peut-être quelque chose comme

$food->allergies()->attach($allergy_ids, $severity_ids);

Modifier: Il pourrait y avoir entre 0 et 20 allergies pour un produit alimentaire spécifique, et un indice de gravité de 0 à 4 pour chaque allergie, si cela peut vous aider.

13
Duncan Ogle

Vous pouvez.

A partir de cet exemple dans Docs ( 4.2 , 5.0 ):

$user->roles()->sync(array(1 => array('expires' => true)));

Version codée en dur pour les deux premières lignes:

$food = Food::find(1);
$food->allergies()->sync([1 => ['severity' => 3], 4 => ['severity' => 1]]);

Dynamiquement, avec vos tableaux $ allergy_ids et $ severities dans un état compatible (taille et tri), vous devez préparer vos données de synchronisation avant. Quelque chose comme:

$sync_data = [];
for($i = 0; $i < count($allergy_ids); $i++))
    $sync_data[$allergy_ids[$i]] = ['severity' => $severities[$i]];

$food->allergies()->sync($sync_data);
22

Vous ne pouvez pas le faire comme vous le faites, alors je suggère une boucle simple:

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

contournement Cependant, si vous souhaitez associer plusieurs allergies avec un niveau de gravité/id unique, procédez comme suit:

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

Le plus simple est en effet de s’attacher aux données supplémentaires, comme ceci:

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

changez les valeurs pour la sévérité de l'allergie alimentaire, mais vous avez l'allusion ... :-)

0
My Brain

Pour affecter un utilisateur à un rôle spécifique, procédez comme suit.

$user = App\User::find(1);
$user->roles()->attach($roleId);

J'espère que cela t'aides

0