如何获取使用groupBy()与Laravel雄辩模型创建的每个组的第一条记录?
问题描述:
我有一个表结构如下名为续订。如何获取使用groupBy()与Laravel雄辩模型创建的每个组的第一条记录?
------------------------------------------------
| 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 |
------------------------------------------------
我需要用最新的valid_upto日期各成员的记录。如何使用Laravel雄辩做到这一点。任何其他简单的方法将不胜感激。
答
在用户模型
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',
}
}
]
答
您可以使用下面的查询你的目的。
$renewals = Renewals::groupBy('membership_id')->orderBy('valid_upto','desc')->get();
+0
这得到所有记录,这不是OP要求的。 –
答
Renewals::groupBy('membership_id')->havingRaw('MAX(valid_upto)')->get();
或
答
在普通的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
使用Laravel,你可以用q写它uery builder为:
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()
你试过了吗? – Jackowski