我有两个模型,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