【问题标题】:Laravel query where clause on the last record of the associated tableLaravel查询关联表最后一条记录的where子句
【发布时间】:2019-05-04 00:36:46
【问题描述】:

我正在开发一个 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 的记录。如何获取?

【问题讨论】:

    标签: laravel eloquent laravel-query-builder


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可以使用 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);
                  });
          });
      }
      

      【讨论】:

      • 谢谢,乔纳斯。但也有办法使用我目前的方法来获取它,好吗?
      • 我为whereHas() 添加了一个解决方案。方法是一样的,只是慢了一点。
      • 非常感谢,乔纳斯。
      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2021-09-18
      • 1970-01-01
      相关资源
      最近更新 更多