Laravel 获取每个组的最新记录

稀有等级

我正在尝试将一些原始 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),我无法弄清楚其余部分

M哈立德朱奈德

您可以将查询重写为左连接以获得相同的结果

select a.* 
from part_histories a
left join part_histories b on a.part_id = b.part_id 
                            and a.created_at < b.created_at
where b.part_id is null

我想你可以在你的范围内轻松转换上面的查询,比如

public function scopeWithLatestStatus($query)
{
    return $query->leftJoin('part_histories as b', function ($join) {
                $join->on('a.part_id', '=', 'b.part_id')
                     ->where('a.created_at', '<', 'b.created_at');
            })
        ->whereNull('b.part_id')
        ->from('part_histories as a')
        ->select('a.*');
}

Laravel Eloquent 选择最大 created_at 的所有行

Laravel - 获取每个 UID 类型的最后一个条目

Laravel Eloquent 组的最新记录

使用上述查询作为has关系进行编辑,要获取每个部分的最新历史记录,您可以定义一个hasOne关系,如

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class Part extends Model
{
    public function latest_history()
    {
        return $this->hasOne(\App\Models\PartHistory::class, 'part_id')
            ->leftJoin('part_histories as p1', function ($join) {
                $join->on('part_histories.part_id', '=', 'p1.part_id')
                    ->whereRaw(DB::raw('part_histories.created_at < p1.created_at'));
            })->whereNull('p1.part_id')
            ->select('part_histories.*');
    }
}

然后要加载具有最新历史记录的零件,您可以将上面定义的映射加载为

$parts = Part::with('latest_history')->get();

您将拥有一份零件清单以及最新的历史记录

Array
(
    [0] => Array
        (
            [id] => 1
            [title] => P1
            [latest_history] => Array
                (
                    [id] => 6
                    [created_at] => 2018-06-16 08:25:10
                    [status] =>  1
                    [part_id] => 1
                )

        )
....
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 Laravel MongoDB 获取每个组的最新行

来自分类Dev

通过SQL获取每个组的最新记录

来自分类Dev

如何从ActiveRecord中的每个组获取最新记录?

来自分类Dev

如何在mongodb中获取每个组的最新记录?

来自分类Dev

Laravel查询最新记录

来自分类Dev

没有在 Laravel 中使用 latest() 获取最新记录

来自分类Dev

如何获取每个组中的最新记录并检查是否是唯一记录?

来自分类Dev

获取记录组中的最新记录

来自分类Dev

Laravel雄辩; 显示最新记录

来自分类Dev

如何在mongodb中获取每个组的最新N条记录?

来自分类Dev

从每个组中有条件地获取最新记录-无需聚合功能或分区

来自分类Dev

Linq:嵌套子查询中的动态Where子句获取每个组的最新记录

来自分类Dev

从多个相关记录中获取一组相关记录laravel?

来自分类Dev

Django ORM-获取组的最新记录

来自分类Dev

Django ORM-获取组的最新记录

来自分类Dev

SQL获取每个ID的最新记录

来自分类Dev

获取列的每个不同值的最新记录

来自分类Dev

MySQL获取每个条件的最新记录

来自分类Dev

Laravel 5.5 使用多对多关系时如何获取最新的 N 条记录?

来自分类Dev

如何仅从 Laravel 5.6 中的数据表中获取最新更新记录?

来自分类Dev

如何根据时间戳获取最新记录但不从laravel中的表中复制?

来自分类Dev

从MYSQL的每个组中获取头条记录

来自分类Dev

laravel:查询获取重复记录laravel

来自分类Dev

laravel:查询获取重复记录laravel

来自分类Dev

MYSQL-选择每个库存组的最新3条记录

来自分类Dev

每个项目mongodb组的按日期最新记录

来自分类Dev

MySQL-不同的结果显示每个组的最新记录

来自分类Dev

MYSQL:仅根据日期返回每个组的最新记录

来自分类Dev

MySQL-不同的结果显示每个组的最新记录

Related 相关文章

  1. 1

    使用 Laravel MongoDB 获取每个组的最新行

  2. 2

    通过SQL获取每个组的最新记录

  3. 3

    如何从ActiveRecord中的每个组获取最新记录?

  4. 4

    如何在mongodb中获取每个组的最新记录?

  5. 5

    Laravel查询最新记录

  6. 6

    没有在 Laravel 中使用 latest() 获取最新记录

  7. 7

    如何获取每个组中的最新记录并检查是否是唯一记录?

  8. 8

    获取记录组中的最新记录

  9. 9

    Laravel雄辩; 显示最新记录

  10. 10

    如何在mongodb中获取每个组的最新N条记录?

  11. 11

    从每个组中有条件地获取最新记录-无需聚合功能或分区

  12. 12

    Linq:嵌套子查询中的动态Where子句获取每个组的最新记录

  13. 13

    从多个相关记录中获取一组相关记录laravel?

  14. 14

    Django ORM-获取组的最新记录

  15. 15

    Django ORM-获取组的最新记录

  16. 16

    SQL获取每个ID的最新记录

  17. 17

    获取列的每个不同值的最新记录

  18. 18

    MySQL获取每个条件的最新记录

  19. 19

    Laravel 5.5 使用多对多关系时如何获取最新的 N 条记录?

  20. 20

    如何仅从 Laravel 5.6 中的数据表中获取最新更新记录?

  21. 21

    如何根据时间戳获取最新记录但不从laravel中的表中复制?

  22. 22

    从MYSQL的每个组中获取头条记录

  23. 23

    laravel:查询获取重复记录laravel

  24. 24

    laravel:查询获取重复记录laravel

  25. 25

    MYSQL-选择每个库存组的最新3条记录

  26. 26

    每个项目mongodb组的按日期最新记录

  27. 27

    MySQL-不同的结果显示每个组的最新记录

  28. 28

    MYSQL:仅根据日期返回每个组的最新记录

  29. 29

    MySQL-不同的结果显示每个组的最新记录

热门标签

归档