仅返回与条件相关的最新记录

问题描述 投票:0回答:1

我有这样的关系:

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 过滤用户的任务?用户可能有数百个事件,但我想按最新的“已完成”或“等待”事件进行过滤。事件的日期时间存储在“开始”列中。

php laravel eloquent eloquent-relationship
1个回答
0
投票
在这种情况下,

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);
    
© www.soinside.com 2019 - 2024. All rights reserved.