2017-10-23 17 views
1

私は機関、フォーム、form_institution(ピボットテーブル)とform_institution_attributesである4つのテーブルを持っています。ピボットテーブルのlaravel 1対多多く

機関表:

public function up() { 
    Schema::create('institutions', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name', 255); 
     $table->softDeletes(); 
     $table->timestamps(); 
    }); 
} 

機関モデル:

public function forms() { 
    return $this->belongsToMany(Form::class, 'form_institution'); 
} 

フォーム表:

public function up() { 
    Schema::create('forms', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name', 255); 
     $table->softDeletes(); 
     $table->timestamps(); 
    }); 
} 

フォームモデル:ここでの移行である

public function institutions() { 
    return $this->belongsToMany(Institution::class, 'form_institution'); 
} 

フォーム機関ピボットテーブル:

Schema::create('form_institution', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('institution_id')->unsigned(); 
    $table->integer('form_id')->unsigned(); 

    $table->foreign('institution_id')->references('id')->on('institutions'); 
    $table->foreign('form_id')->references('id')->on('forms'); 
}); 

すべてがここまでokです。しかし、私はここで

属性テーブルであり、それは、ピボットテーブルの間の関係(1対多)だもう一つのテーブルを追加する必要があるテーブルです:さて、私は施設テーブルや機関を呼び出すとき

Schema::create('form_institution_attributes', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('form_institution_id')->unsigned(); 
      $table->integer('field_name_id')->unsigned(); 
      $table->integer('input_type_id')->unsigned(); 
      $table->string('field_caption'); 
      $table->softDeletes(); 
      $table->timestamps(); 

      $table->foreign('form_institution_id')->references('id')->on('form_institution'); 
     }); 

- >フォームのパラメータ、私はピボットテーブルでform_institution_attribute(サブテーブル)を取得したい。しかし、私はこれを行うことができませんでしたか?

ピボットテーブルの下にテーブルを1対多の関係で追加するにはどうすればよいですか?

+0

は、まず、あなたがあなたの最後の移行ファイル内のいくつかのミスを持っています。 'institution_form'テーブルが存在しないため、 'form_institution'テーブルを参照する必要があります。また、 'institution_form_id'の命名はform_institution_id 'でなければなりません。あなたがそれらを修正すれば、人々があなたを助けやすくなります。 –

+0

@OrestisPalampougioukis私はそれを逃した、私はform_institutionとして編集しました。 – Nevermore

+0

余分なテーブルを必要としない場合は、ピボットテーブルに直接属性を追加します。 '$ this-> belongsToMany(Form :: class、 'form_institution') - > withPivot( 'field_name_id'、 'input_type_id'、 'field_caption');などのようにして、最後にマイグレーションファイルに列を定義します。 [http://laraveldaily.com/pivot-tables-and-many-to-many-relationships/](http://laraveldaily.com/pivot-tables-and-many-to-many-relationships/) –

答えて

2

HasManyThroughの種類の関係を使用できるはずです。

しかし、最良の解決策は、 'form_institution'テーブルで作成した余分な列にこれらの属性を追加してから、関係定義にwithPivotメソッドを追加することでより簡単にそれらを取得することだと思います。

だから、次のようになります。

public function forms() { 
    return $this->belongsToMany(Form::class, 'form_institution') 
     ->withPivot([ 
      'field_name_id', 
      'field_caption'. 
      ... 
     ]); 
} 

public function institutions() { 
    return $this->belongsToMany(Institution::class, 'form_institution') 
     ->withPivot([ 
      'field_name_id', 
      'field_caption'. 
      ... 
     ]); 
} 
+0

これは、1つの機関の下で多くのピボットパラメータを作成します。これは近づいていますか? 1つのピボットの下に多くの属性を追加したかったのです。しかし、今、私は多くのピボットを持っています。 – Nevermore

+1

まず、私は自分の答えを編集して、おそらくHasManyThrough関係を利用することができると示唆しました。しかし、ピボットテーブルに必要な属性を追加することで、正直なところ問題は見えません。 'form_institution'という1つのピボットテーブルのみが存在します。これは、institution_id、form_id、および新しい 'form_institution_attributes'テーブルに挿入する「余分な」属性の両方を保持します。 –