如何从hasManyThrough雄辩的关系中返回Laravel中的单个模型

时间:2018-04-15 16:49:03

标签: php laravel laravel-5 eloquent relationship

我有以下表结构:

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: [ { ... } ] } 以获得工程师,但是,我宁愿不必先打电话给每个这样的收集。

因此;

问题1

我的$ticket->assignedEngineer->first()关系是否正确,或者我在这里过于复杂?

问题2

我可以在我的hasManyThrough上使用哪些scopes处理hasMany关系只会返回item内的collection->first()所以我没有每次都致电start

1 个答案:

答案 0 :(得分:0)

不是最优雅的解决方案,但它确实有效。

assignedEngineer更改为assignedEngineers并向Ticket模型添加accessor

public function getAssignedEngineerAttribute() {
    return $this->assignedEngineers->first();
}

然后你可以得到一个Staff这样的模型:

$ticket->assignedEngineer

如果您要返回JSON回复,请将其添加到Ticket

protected $appends = ['assignedEngineer'];