laravel eloquent query group by last id

时间:2014-10-24 13:54:53

标签: laravel laravel-4

您好我试图在每个设备的DB中获取最后一个寄存器

我喜欢

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();

感谢您的帮助!

3 个答案:

答案 0 :(得分:6)

一种简单的方法,没有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(),以便我们不依赖于id的顺序来确定最近的条目,而是在每条记录的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>');
    }
}

答案 1 :(得分:0)

我不确定是否有更简单的方法,因为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();

答案 2 :(得分:0)

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; 
    }

这很有用,谢谢你的帮助!