【问题标题】:how to get latest record from database table against each value in column Laravel-8?如何根据 Laravel-8 列中的每个值从数据库表中获取最新记录?
【发布时间】:2022-01-03 00:10:56
【问题描述】:

我一直在做一个项目,在从表中获取记录时有点卡住,在这方面需要一些帮助。现在的情况是我有一个类似下面的表格:

id col_1        col_2               created _at         updated_at
1      1        some value          timestamps          timestamps
2      1        some new value      timestamps          timestamps
3      2        some value          timestamps          timestamps  
4      2        some new value      timestamps          timestamps

现在,正如您在 col_1 中看到的那样,每次插入一个针对它们的值时,都会有重复的值数字。现在我正在研究并坚持的是针对 col_1 中的每个值获取最新记录。所以我的结果看起来像这样

id col_1        col_2               created _at         updated_at
2      1       some new value       timestamps          timestamps
4      2       some new value       timestamps          timestamps

以下是我尝试过的一段代码,但得到了错误的数据。

  $data = TableName::select(DB::raw('t.*'))
            ->from(DB::raw('(SELECT * FROM table_name) t'))
            ->groupBy('t.col_2')->latest()
            ->first();
        dd($data);
        return view('view_name')->with([
            'data' => $data
        ]);
    }

知道如何在 Laravel 中实现这样的目标。任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: php laravel eloquent laravel-8


    【解决方案1】:

    我认为以下内容应该会给您想要的结果。

    $data = DB::table('table_name')
      ->groupBy('col_1')
      ->latest()
      ->get();
    

    如果TableName模型关联了正确的表(dd(TableName::query()->toSql());时检查查询是否正确),则可以将查询替换为

    $data = TableName::groupBy('col_1')->latest()->get();
    

    【讨论】:

    • 好吧,它不工作是返回每个组的第一个结果:)
    【解决方案2】:

    从技术意义上讲,当您对行进行分组时,未/不能分组的列失去了意义。因此,在这种情况下,您可以或者更确切地说应该在两个单独的查询中执行此操作(尤其是在 SQL full group only 模式打开的情况下)。一个用于分组,另一个加入实际记录。

    看看这样的方法是否有效:

    $grouped = Model::select('col_id as merged_col_id', DB::raw('max(id) as latest_id'))->groupBy('col_id'); //since `id` field looks autoincrementing, using max(id) here should give you the latest record from all merged columns.
    
    return Model::select('id', 'col_id', 'val')->joinSub($grouped, 'grouped', function($join){
        $join->on('grouped.latest_id', '=','table_name.id');
    })->get();
    

    注意适当地更改Modeltable_name

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 2021-12-10
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 2015-11-07
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多