web-dev-qa-db-ja.com

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になります。

16
Duncan Ogle

あなたはできる。

ドキュメントのこの例から( 4.25. ):

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

最初の2行のハードコードバージョン:

$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);

好きなようにできないので、簡単なループをお勧めします。

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

回避策ただし、単一の重大度レベル/ IDで複数のアレルギーを添付したい場合は、これを行うことができます:

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

最も簡単なのは、次のように追加のデータを添付することです。

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

食物アレルギーの重症度の値を変更しますが、ヒントが得られます... :-)

0
My Brain

ユーザーを特定のロールに割り当てるには、以下を実行します。

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

お役に立てれば

0