【问题标题】:laravel eloquent query group by last idlaravel eloquent 查询组按最后一个 id
【发布时间】:2014-10-27 21:36:07
【问题描述】:

您好,我正在尝试为每个设备获取数据库中的最后一个寄存器

我喜欢

id   | id_equip
-----+----------
   1 |    3
   2 |    3
   3 |    3
   4 |    2
   5 |    2

我想查询每个装备的最后一个id,比如:

  id   | id_equip
  -----+----------
  3    |    3
  5    |    2

我试过这个:

$calibracao = $this->calibracao->orderBy('id', 'DESC')->groupBy('id_equip')->get();

感谢您的帮助!

【问题讨论】:

  • 好的,有什么问题?你遇到了什么错误?
  • 我想订购,但我只得到每件装备中的第一个,我想要的是最后一个

标签: laravel laravel-4


【解决方案1】:

一个简单的方法,不用join,用max

$query = DB::table('equip')
    ->select(DB::raw('*, max(id) as id'))
    ->groupBy('id_equip')
    ->orderBy('id', 'asc')
    ->get();

(当然,假设您可以指望您的id 符合日期顺序。)


你也可以用 Eloquent 做到这一点,使用自引用的一对一关系。查询需要更长的时间,但它更像 Laravel:

在模型中定义关系:

class myModel extends Eloquent {
    public function latestEquipment()
    {
        return $this->hasOne('myModel', 'id_equip', 'id_equip')->latest();
    }
}

(请注意,在这种情况下,我们使用latest(),因此我们不依赖ids 的顺序来确定最近的条目,而是依赖每条记录的created_at 日期。这样更准确。)

检索所有记录及其最新设备条目:

$latest = myModel::with('latestEquipment')->groupBy('id_equip')->get();
// loop over the results
foreach ($latest as $l) {
    if ($l->equipment) {
        echo('ID: ' . $l->id . 'ID_EQUIP: ' . $l->id->id_equip . '<br>');
    }
}

【讨论】:

    【解决方案2】:

    我不确定是否有更简单的方法,由于join,这有点令人费解,但它应该给出你想要的结果:

    DB::table('equip as e')
        ->select('e.*')
        ->join(DB::raw("(SELECT id_equip, MAX(id) id FROM equip GROUP BY id_equip) as _e"), function ($join) {
            $join->on('e.id', '=', '_e.id')->on('e.id_equip', '=', '_e.id_equip');
        })
        ->orderBy('id', 'asc')
        ->get();
    

    【讨论】:

      【解决方案3】:
      public function latest($equipamentos)
          {
              foreach ($equipamentos as $equip) 
              {
                  $latest[$equip->cod] = DB::table('tb_calibracao')
                                      ->where('cod_equipamento', $equip->cod)
                                      ->where('parecer', '1')
                                      ->orderBy('cod', 'Desc')
                                      ->first();
              }
      
              return $latest; 
          }
      

      成功了,谢谢你的帮助!

      【讨论】:

        猜你喜欢
        • 2018-08-24
        • 2021-12-28
        • 2015-03-08
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 2017-10-15
        • 2017-10-22
        相关资源
        最近更新 更多