How to get first record of each group created using groupBy() with Laravel eloquent model?

时间:2017-10-12 10:13:28

标签: mysql laravel laravel-5 eloquent greatest-n-per-group

I have a table structured as following named renewals.

------------------------------------------------
| id  | membership_id| valid_from | valid_upto |
------------------------------------------------
|  1  | 1            | 2015-02-15 | 2016-02-15 |
|  2  | 2            | 2015-05-16 | 2016-05-16 |
|  3  | 2            | 2016-05-16 | 2017-05-16 |
|  4  | 3            | 2014-06-16 | 2015-06-16 |
|  5  | 3            | 2015-06-16 | 2016-06-16 |
|  6  | 3            | 2016-06-16 | 2017-06-16 |
|  7  | 1            | 2016-02-15 | 2017-02-15 |
------------------------------------------------

I need to get record of each members with latest valid_upto date. How to do that using Laravel Eloquent. Any other easy method will be appreciated.

4 个答案:

答案 0 :(得分:0)

在用户模型中

public function latest_renewal()
{
    return $this->hasOne('App\Renewals', 'membership_id')->latest('valid_upto');
}

在控制器中

$users = User::with('latest_renewal')->get();
/*
 [
   {
     'id' => 1,
     'name' => 'user1',
     'latest_renewal' => {
         'id' => 7,
         'membership_id' => 1,
         'valid_from' => '2016-02-15',
         'valid_upto' => '2017-02-15',

     }
   },
   {
     'id' => 2,
     'name' => 'user2',
     'latest_renewal' => {
         'id' => 3,
         'membership_id' => 2,
         'valid_from' => '2016-05-16',
         'valid_upto' => '2017-05-16',

      }
    }
 ]

答案 1 :(得分:0)

您可以使用以下查询。

df = dfRawData.filter(col("X").between("CB","CI","CR"))

答案 2 :(得分:0)

Renewals::groupBy('membership_id')->havingRaw('MAX(valid_upto)')->get();

Renewals::groupBy('membership_id')->having( function( $query )
{
    $query->latest('valid_upto');
})->get();

答案 3 :(得分:0)

在普通的MySQL中,您可以通过以下方式获得每位成员的最新记录:

select a.*
from renewals a
left join renewals b on a.membership_id = b.membership_id
and a.valid_upto < b.valid_upto
where b.membership_id is null

DEMO

使用Laravel,您可以使用查询构建器将其编写为:

DB::table('renewals as a')
  ->select('a.*')
  ->leftJoin('renewals as b', function ($join) {
        $join->on('a.membership_id','=','b.membership_id')
             ->whereRaw(DB::raw('a.valid_upto < b.valid_upto'));
   })
  ->whereNull('b.membership_id')
  ->get()