laravel eloquent query group by last id

Luc*_*pos 2 laravel laravel-4

嗨,我正在尝试为每个设备获取DB中的最后一个寄存器

我喜欢

id   | id_equip
-----+----------
   1 |    3
   2 |    3
   3 |    3
   4 |    2
   5 |    2
Run Code Online (Sandbox Code Playgroud)

我想像每个装备的最后一个ID一样查询:

  id   | id_equip
  -----+----------
  3    |    3
  5    |    2
Run Code Online (Sandbox Code Playgroud)

我试过这个:

$calibracao = $this->calibracao->orderBy('id', 'DESC')->groupBy('id_equip')->get();
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

dam*_*ani 7

一个简单的方法,没有join,使用max:

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

(当然,假设你可以依靠你的id日期顺序.)


您也可以使用Eloquent,使用自引用一对一关系来完成此操作.查询需要更长时间,但它更像是Laravel:

在模型中定义关系:

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

(请注意,在这种情况下,我们正在使用,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>');
    }
}
Run Code Online (Sandbox Code Playgroud)