我有兩個模型,User
和Seminar
。在英語中,基本思想是一羣用戶參加任何數量的研討會。此外,每個研討會上只有一名用戶可以自願發言。Laravel - Flatten data via`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]
前的響應,但真的很臭,我覺得應該有辦法通過雄辯本身實現這一點。
如何將通過with
調用添加的數據變平? (或重寫我的關係方法)
這會不會讓你玩與查詢,並且不會讓您使用'with'作爲模型中的關係熱切加載它。 –
@JosephSilber可能會......但這會解決OP的問題。 – linuxartisan
謝謝@JosephSilber ...這正是我沒有采用這種方法的原因。 – tam5