2016-06-22 4 views
0

私はこの関係を働かせるために何が必要なのか理解できません。配列項目と他の表との間の曖昧な関係

私は3つのフィールドを持つ製品更新用のフォームを用意しています。 更新ID,説明および影響を受けるエリア

影響を受けるエリアは、当社ビル内の各作業エリアのチェックボックスのグループです。送信された選択された領域がテーブルに配列として格納されます。これらの分野とその中のすべての人々との関係を作り、製品のアップデートのリストを表示しているときに、このアップデートの影響を受けるすべての人をリストアップできるようにする必要があります。

この時点で私は3つのテーブルを持っています。

  1. update_info - ID、説明、affected_areas
  2. update_people - ID、名前、
  3. update_areas AREA_ID - ID、エリア

を私はの配列を作って行く方法を理解していません影響を受けるエリアはupdate_areasに関連し、各エリアはそのエリアIDを持つ人員に関連しています。私のアプローチは近づいていますか?これを行う

`パブリック関数は、(リクエスト$リクエスト)を作成

{ 


    $update = new Update; 

    $update->id = $request->number; 

    $update->description = $request->description; 

    $update->areas()->sync($request->input('area')); 

    $update->save(); 

    return view('updates.index'); 

}` 

私は致命的なエラーが発生します。

致命的なエラー:あなたはおそらくupdate_info_areasのようなものと呼ばれるピボットテーブルを必要とするが、それはあなたの選択だ、あなたはそのように行うことができないヌル

答えて

0

上メンバ関数同期()を呼び出します。このピボットテーブルは、テーブル内の配列を展開して、データベースが追加のテーブルに結合するのに使用できるようにするものです。 のid1に10個の領域がある場合、ピボットテーブルには10レコードがあり、update_info_idは1レコードごとに1であり、area_idはのareaとなり、それはupdate_infoになります。

このテーブルには、あなたのupdate_info.id列とあなたのupdate_areas.id列に関連するでしょうarea_id列に関連するでしょうupdate_info_id列を持っているでしょう。

update_infoupdate_areasの間にはbelongsToManyという関係があります。

これを使用してレコードを追加するには、非常に簡単です。

例として

、これが最初のすべてを削除します。1.

$updateInfo = UpdateInfo::find(1); 
$updateInfo->areas()->sync([1,3,4,5,6]); 

のIDでupdate_infoにあなたは、ID 1、3、4、5の領域を設定しようとしているとしましょう、と6その更新された情報に関連する領域を選択し、選択された領域を再追加する。

あなたは、その領域に既に存在するものをすべて削除することなく、特定の領域を取り付けたり取り外したりしたいと思ったら...それは同じように簡単です。のは、私は新しいエントリを作成するために私のコントローラ内の領域の配列をループだろうあなたは今そのupdate_infoからエリア1と3を削除しますが、フォームが送信されたときにも、だから、エリア2

$updateInfo = UpdateInfo::find(1); 
$updateInfo->areas()->detach([1,3]); 
$updateInfo->areas()->attach([2]); 
+0

を添付したいとしましょうupdate_info_areasの各領域では?フォームからコントローラに渡された配列を処理するためのより良い方法はありますか? – CFree

+0

これは一般的な考えですが、LaravelはbelongsToManyを使用するといくつかの方法を提供します。私は答えを更新します。 – user3158900

+0

いいえ私は関係を理解し​​ていると思うが、フォームがコントローラに配列を渡すとき、データは次のようになる: '' area "=>配列:4 [ 0 =>" CPT " 1 = > "ENGINEERING TECH" 2 => "レイアウト" 3 => "プロダクションマネージャ" "私の更新エリアテーブルを照会して、それぞれの_id_を取得して同期機能を使用する必要がありますか? – CFree