我正在开发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的记录。如何获取?
答案 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();
您实际上渴望只加载治疗,而不是治疗日志。这就是为什么当您以后访问每个治疗的治疗日志时,它们没有被过滤的原因。
让我知道是否需要更好地解释-我的术语在这里并不完美。