【发布时间】:2018-09-25 10:23:46
【问题描述】:
我的表结构如下:
tickets
- id
assignments
- id
- ticket_id
- staff_id
- role
- isAssigned
staff
- id
- username
我在tickets 模型上创建了一个hasManyThrough 关系,它通过assignments 表成功返回了与ticket 关联的所有staff。
public function staff()
{
return $this->hasManyThrough(Staff::class, Assignment::class);
}
assignments 表可以为同一个role 的ticket 保存一条或多条记录,其中isAssigned 标志指定staff 关联是否处于活动状态。因此,对于给定的role,只有 1 条记录将永远拥有isAssigned = 1
我利用query scopes来限制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() 来联系工程师,但是,我宁愿不必在每个此类集合上都先致电。
所以;
问题 1
我的hasManyThrough 关系正确吗,还是我在这里把事情复杂化了?
问题 2
有什么我可以在我的scopes 上或在我的hasMany 关系上工作的东西,这些关系只会在collection 内返回一个item,这样我就不必每次都调用->first()?
【问题讨论】:
-
关系叫
staff还是assignedEngineer?或者他们是不同的关系? -
可以分配多个工程师吗?请在您的模型中分享您的员工定义。
-
hasManyThrough无法仅返回 1 件商品。您可以使用->take(1),但它仍会被包装在一个集合中。您最好创建一个belongsToMany以将tickets连接到staff,反之亦然。并使用assignments作为数据透视表。 -
@JonasStaudenmeir -
hasManyThrough关系称为staff,它返回与ticket关联的所有staff。 scopeWithAssignedEngineerscope使用staff关系,但对其进行进一步过滤。 -
响应中的
assignedEngineer只是staff结果吗?还是按role过滤?
标签: php laravel laravel-5 eloquent relationship