【发布时间】:2018-11-22 16:28:14
【问题描述】:
我正在尝试将一些原始 SQL 迁移到我模型上的 Eloquent(或查询生成器)范围。我的零件历史表如下所示:
+----+---------+--------+------------+
| id | part_id | status | created_at |
+----+---------+--------+------------+
| 1 | 1 | 1 | ... |
| 2 | 1 | 2 | ... |
| 3 | 2 | 1 | ... |
| 4 | 1 | 2 | ... |
| 5 | 2 | 2 | ... |
| 6 | 1 | 3 | ... |
请注意,同一个 part_id 可以有多个状态相同的条目。
目前我使用以下选择最新状态:
$part = Part::leftjoin( DB::raw("
(SELECT t1.part_id, ph.status, t1.part_status_at
FROM (
SELECT part_id, max(created_at) part_status_at
FROM part_histories
GROUP BY part_id) t1
JOIN part_histories ph ON ph.part_id = t1.part_id AND t1.part_status_at = ph.created_at) as t2
)", 't2.part_id', '=', 'parts.id')->where( ... )
我正在尝试以此为零件模型制作一个范围,到目前为止我有这个:
public function scopeWithLatestStatus($query)
{
return $query->join(DB::raw('part_histories ph'), function ($join) {
$join->on('ph.part_id', '=', 't1.id')->on('t1.part_status_at', '=', 'ph.created_at');
})
->from(DB::raw('(select part_id as id, max(created_at) part_status_at from part_histories GROUP BY part_id) t1'))
->select('t1.id', 'ph.part_status', 't1.part_status_at');
}
这是其中的一部分(但仍然使用一些原始 SQL),我只是想不通其余的
【问题讨论】:
-
只是出于好奇,为什么?如果原始 SQL 工作正常,那么切换到 ORM 有什么好处?我知道这与问题无关,我只是好奇。
-
好点,戈登 :-) 主要是因为我正在将其他东西更改为 ORM。事实证明,我决定坚持使用原始 SQL,因为我并没有很好地解释我的问题。
标签: php mysql laravel eloquent greatest-n-per-group