我有这样的关系:
public function latestEvent(): HasOne
{
return $this->hasOne(Event::class, 'client_id', 'id')
->whereIn('status', ['completed', 'waiting'])
->latest('start');
}
当我运行此查询时
$patients = User::with('status', 'userMeta', 'latestEvent', 'latestEvent.employee', 'latestEvent.procedure')->whereHas('role', function ($query) {
$query->where('name', 'client');
});
$patients->whereHas('latestEvent', function ($query) use ($request) {
$query->where('procedure_id', $request->get('procedurе_filter'));
});
$patients = $patients->orderBy('created_at', $order)->paginate(10);
我得到的结果好坏参半。如果用户过去有过与 procedure_id 匹配的事件,尽管这不是用户的最新事件,但它们也会进入结果。
然后我尝试改变与此的关系:
return $this->hasOne(Event::class, 'client_id', 'id')
->whereIn('status', ['completed', 'waiting'])
->latestOfMany();
我虽然它有效,但是当我为用户创建新事件时(该事件的状态为“即将到来”,因此它不满足 whereIn 条件),调用关系时的结果为 NULL。看起来latestOfMany()总是获得最高的ID并忽略where条件。
如何有效地执行按最新事件 procedure_id 过滤用户的任务?用户可能有数百个事件,但我想按最新的“已完成”或“等待”事件进行过滤。事件的日期时间存储在“开始”列中。
hasOne
关系可能会很棘手。我不太了解一对一的关系来诊断问题。但我知道一个可能适合你的替代方案。我们可以
从子查询中选择:
return User::addSelect([
'latest_event_procedure_id' => Flight::select('procedure_id')
->whereColumn('client_id', 'patients.id')]
->whereIn('status', ['completed', 'waiting'])
->orderByDesc('start'))
])
->with('status', 'userMeta', 'latestEvent', 'latestEvent.employee', 'latestEvent.procedure')
->whereHas('role', function ($query) {
$query->where('name', 'client');
})
->having('latest_event_procedure_id', request('procedurе_filter'))
->orderBy('created_at', $order)
->paginate(10);