Laravel查询关联表最后一条记录的where子句

时间:2018-12-02 15:08:49

标签: laravel eloquent laravel-query-builder

我正在开发Laravel应用程序。我在使用where子句查询关联的两个表时遇到问题。这是我的数据库架构。

patients
========
id, name, email, password, created_at

treatments
==========
id, created_at, disease, note, patient_id

treatment_logs
=============
id, status, created_at, treatment_id

我的数据库架构非常简单。现在,我想创建一个查询,以最后一个treatment_logs状态为1的方式获取用户的待遇。这是我的查询

class Patient extends Model {

    public function intensiveTreatments()
    {
        return $this->treatments()->whereHas('treatment_logs', function ($query) {
            $query->orderBy('id', 'desc')
                ->take(1)
                ->where('status', 1);
        });
    }

}

该查询的问题在于,处理日志的最后记录状态如何无关紧要。只要存在状态为1的treatment_logs,它将返回记录。但是我只想获取状态为1的最后一个treatment_logs的记录。如何获取?

2 个答案:

答案 0 :(得分:1)

您可以使用JOIN:

public function intensiveTreatments()
{
    return $this->treatments()
        ->select('treatments.*')
        ->join('treatment_logs', 'treatments.id', 'treatment_logs.treatment_id')
        ->where('treatment_logs.status', 1)
        ->where('treatment_logs.id', function($query) {
            $query->select('id')
                ->from('treatment_logs')
                ->whereColumn('treatment_id', 'treatments.id')
                ->orderByDesc('id')
                ->limit(1);
        });
}

或将其集成到whereHas()中:

public function intensiveTreatments()
{
    return $this->treatments()->whereHas('treatment_logs', function ($query) {
        $query->where('status', 1)
            ->where('id', function ($query) {
                $query->select('id')
                    ->from('treatment_logs as latest')
                    ->whereColumn('latest.treatment_id', 'treatment_logs.treatment_id')
                    ->orderByDesc('id')
                    ->limit(1);
            });
    });
}

答案 1 :(得分:0)

添加一个->with('treatment_logs', function($query) { [... same clauses you use in whereHas...] })。发生这种情况,是因为您的查询正在过滤治疗而不是治疗日志。因此,例如当您执行此操作时:

$patient = Patient::with('intensiveTreatments')->get();

您实际上渴望只加载治疗,而不是治疗日志。这就是为什么当您以后访问每个治疗的治疗日志时,它们没有被过滤的原因。

让我知道是否需要更好地解释-我的术语在这里并不完美。