我有以下表结构:
tickets
- id
assignments
- id
- ticket_id
- staff_id
- role
- isAssigned
staff
- id
- username
我在tickets
模型上创建了hasManyThrough
关系,该关系通过staff
表成功返回与ticket
相关联的所有assignments
。
public function staff()
{
return $this->hasManyThrough(Staff::class, Assignment::class);
}
assignments
表可以为同一ticket
的{{1}}保存1个或多个记录,role
标志指定isAssigned
关联是否有效。因此,给定staff
只有1条记录会有role
我使用query scopes
来限制isAssigned = 1
关系返回的结果,例如:
hasManyThrough
因此,如果我致电public function scopeWithAssignedEngineer($builder)
{
$filter = function ($staff) {
$staff->where([['isAssigned', 1], ['role', 'engineer']]);
};
return $builder->whereHas('staff', $filter)->with(['staff' => $filter]);
}
,我会将我的机票与指定的工程师联系起来,但工程师是一个集合而不是项目。
Ticket::withAssignedEngineer()->where('id', 123)->get();
使用回复时我可以致电ticket: {
id: 123,
assigned_engineer: [
{
...
}
]
}
以获得工程师,但是,我宁愿不必先打电话给每个这样的收集。
因此;
我的$ticket->assignedEngineer->first()
关系是否正确,或者我在这里过于复杂?
我可以在我的hasManyThrough
上使用哪些scopes
处理hasMany
关系只会返回item
内的collection
个->first()
所以我没有每次都致电start
?
答案 0 :(得分:0)
不是最优雅的解决方案,但它确实有效。
将assignedEngineer
更改为assignedEngineers
并向Ticket
模型添加accessor:
public function getAssignedEngineerAttribute() {
return $this->assignedEngineers->first();
}
然后你可以得到一个Staff
这样的模型:
$ticket->assignedEngineer
如果您要返回JSON回复,请将其添加到Ticket
:
protected $appends = ['assignedEngineer'];