【问题标题】:Get last records from relationship in Laravel从 Laravel 中的关系中获取最后的记录
【发布时间】:2021-04-21 19:10:58
【问题描述】:

我在 Person 和 Visit 表之间有一对多的关系,如下所示:

public function visits()
{
    return $this->hasMany('App\Models\Visit');
}

并希望在这样的关系中获得sickness_id 为 1 的人:

$persons = Person::whereHas('visits', function ($query) {
    $query->where('sickness_id',  1);
})->get();

它工作正常,但我只想搜索每个人的最后一次访问。

我的意思是,如果一个人有两次访问,一次访问 sickness_id 为 1,另一次访问 sickness_id 为 2,不要返回此人,因为最后一次访问是 sickness_id,共 2 个。

【问题讨论】:

标签: php laravel eloquent greatest-n-per-group


【解决方案1】:
$person = modelname::query()
     ->where(['sickness_id' => '1' ])
     ->select('visits')
     ->orderBy('id', 'DESC')
     ->first();

【讨论】:

    【解决方案2】:

    我认为上面的答案会奏效。使用addSelect,这也可能有效:

    Person::addSelect('last_visit_id', Visit::select('id')
        ->whereColumn('person_id', 'persons.id')
        ->latest()
        ->limit(1)
    )
    ->where('last_visit_id', 1)
    ->get();
    

    【讨论】:

      【解决方案3】:

      您可以为此使用 hasOne 关系:

      public function lastVisit()
      {
          return $this->hasOne('App\Models\Visit')->latest();
      }
      

      然后你就可以加载它了:

      $persons = Person::whereHas('lastVisit', function ($query) {
          $query->where('sickness_id',  1);
      })->get();
      

      【讨论】:

      • 我已经尝试过这个解决方案,但没有按预期工作
      猜你喜欢
      • 1970-01-01
      • 2019-09-08
      • 2018-06-26
      • 1970-01-01
      • 2016-07-29
      • 2017-10-29
      • 1970-01-01
      • 2015-08-13
      • 2014-10-21
      相关资源
      最近更新 更多