2016-11-04 10 views
1

私はUserSeminarという2つのモデルがあります。英語では、基本的な考え方は、多数のユーザーが多数のセミナーに参加するということです。さらに、正確に1人のユーザーが各セミナーでボランティアして話すことができます。Laravel - `with`によってデータが追加されました

私の実装は、usersテーブル、seminarsテーブル、seminar_userピボットテーブルで構成されています。

seminar_user表には、このような構造を持って次のような関係が定義されている

seminar_id | user_id | speaking 
-------------|-----------|--------- 
    int  | int | bool 

/** On the Seminar model */ 
public function members() 
{ 
    return $this->belongsToMany(User::class); 
} 

/** On the User model */ 
public function seminars() 
{ 
    return $this->belongsToMany(Seminar::class); 
} 

私は意志「関係」を設定する方法を見つけ出すのに苦労しています私がセミナーの講演者を手伝ってください。私は現在、このようなメソッドを定義している:

public function speaker() 
{ 
    return $this->members()->where('speaking', true); 
} 

私が好きな理由は、最終的に、私はこのような何かを見て、私のAPI呼び出しが欲しいので、これはされています

public function index() 
{ 
    return Seminar::active() 
     ->with(['speaker' => function ($query) { 
      $query->select('name'); 
     }]) 
     ->get() 
     ->toJson(); 
} 

問題がありますmembersの関係は実際にはbelongsToManyなので、ただUserとなることがわかっていても、speakingが真の場合は、Userの配列が常に返されます。

回避策の一つは、応答まず、一時$seminars変数を設定foreachを経由して各$seminar['speaker'] = $seminar['speaker'][0]を設定することにより、それを送信する前にフォーマット後になりますが、それは本当に臭いやへの道があるはずような気がしますこれをEloquentを通して達成する。

withコールで追加されるデータは、どのようにフラット化できますか?あなたが現在受け取るコレクションとは対照的に、(あるいは、私の関係のメソッドを書き換える)

答えて

1

この

public function speaker() 
{ 
    return $this->members()->where('speaking', true)->first(); 
} 

にごspeaker機能を変更してみてくださいこれは、常にあなたの項目を提供します。

+1

へあなたはモデルで関係としてeager-loadするために 'with'を使うことはできません。 –

+0

@JosephSilberかもしれないが、これはOPの問題を解決するだろう。 – linuxartisan

+0

ありがとう@JosephSilber ...これが私がこのアプローチを採用しなかった理由です。 – tam5

0

君はSeminarモデルに新しい関係を定義することができます。

public function speaker() 
{ 
    return $this->belongsToMany(User::class)->wherePivot('speaking', true); 
} 

そして、あなたのクエリは、のようになります:これは、あなたがプレーさせません

Seminar::active() 
    ->with(['speaker' => function ($query) { 
     $query->select('name'); 
    }]) 
    ->get() 
    ->toJson(); 

DocsスクロールダウンFiltering Relationships Via Intermediate Table Columns

+0

効果的に、このコードと私が現在持っているものとの唯一の違いは、 'where'を' wherePivot'に変更したことだけです。この場合、それはまったく同じものを返します。したがって、あなたのソリューションは私がすでに持っているのと同じ結果をもたらします。: – tam5

+0

違いは '$ this-> belongsToMany()'です。試しましたか? –

+0

実際、私は 'belongsToMany'を返す' members'関数を呼び出しています。いずれにせよ、私は試しましたが、 'belongsToMany'は複数の値を取得して1つの値だけが存在していてもオブジェクトの配列を返すことを前提としています。 – tam5

関連する問題