代码之家  ›  专栏  ›  技术社区  ›  Wai Yan Hein

关联表的最后一条记录上的laravel query where子句

  •  0
  • Wai Yan Hein  · 技术社区  · 6 年前

    我正在开发一个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
    

    我的数据库模式非常简单。现在,我要做的是创建一个查询,获取最后一个处理日志状态为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的处理日志,它将返回记录。但我只想获取状态为1的最后一个处理日志的记录。我怎么能拿到?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Jonas Staudenmeir    6 年前

    可以使用联接:

    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);
                });
        });
    }
    
        2
  •  0
  •   Criss    6 年前

    添加一个 ->with('treatment_logs', function($query) { [... same clauses you use in whereHas...] }) . 这是因为您的查询是筛选治疗而不是治疗日志。例如,当你这样做的时候:

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

    实际上,您只需要加载治疗,而不需要加载治疗日志。这就是为什么,当您稍后访问每个治疗的治疗日志时,它们是未过滤的。

    如果我需要更好地解释,请告诉我-我这里的术语并不完美。