私はUser
とSeminar
という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
コールで追加されるデータは、どのようにフラット化できますか?あなたが現在受け取るコレクションとは対照的に、(あるいは、私の関係のメソッドを書き換える)
へあなたはモデルで関係としてeager-loadするために 'with'を使うことはできません。 –
@JosephSilberかもしれないが、これはOPの問題を解決するだろう。 – linuxartisan
ありがとう@JosephSilber ...これが私がこのアプローチを採用しなかった理由です。 – tam5