您好我试图在每个设备的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();
感谢您的帮助!
答案 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;
}
这很有用,谢谢你的帮助!