Return只有最高的装备维修id

Return only the highest equipment maintenance id

我想获得 equipament 的最高 maintence_id 以显示给用户。我可以在 SQL 中执行此操作,但不能在 Eloquent 或 QueryBuilder 中执行。

Eloquent returns 我认为的所有维护:

$equipament = Maintence::SELECT('maintences.*', 'equipaments.patrimony as patrimony')
            ->LEFTJOIN('equipaments', 'maintences.equipament_id', '=', 'equipaments.id' )   
            ->get(); 

SQL 返回 equipament 的最高 maintence_id:

select * 
from  equipaments
left join maintences on maintences.equipament_id = equipaments.id 
and maintences.id = (select max(id) from maintences as main 
where 
main.equipament_id = equipaments.id )

试一试:

Maintence::join( DB::raw(
    '(select max(id) as id,equipament_id as equipament_id  from maintences group by equipament_id order by id desc) sub'
  ), 'sub.equipament_id', '=', 'equipaments.id')
  ->get(['maintences.*']);

有同样的问题here。 总是尽可能使用更简单的术语来搜索问题。其作品! :)

关于问题。 例如,为什么最大 ID 而不是最新版本的设备? 检查您真正想要的是什么,因为例如序列 ID 不一定更新得更多。

我想这就是你要找的:

Equipment::select('equipments.id', 'equipments.name', 'maintenances.id as maintenance_id')
        ->leftJoin( \DB::raw(
            '(select max(id) as id,equipment_id as equipment_id  from maintenances group by equipment_id order by id desc) maintenances'
          ), 'maintenances.equipment_id', '=', 'equipments.id')
          ->get();

我假设您的 table 名称是 equipmentsmaintenances,如果不是,请在提供的查询中相应地调整 table 名称。

我不建议您在 JOIN 子句中或在 SELECT 一个中使用内部查询...它将 运行 它用于 "each" 行。最好在模型 Class 上声明一个将获得最后一个的关系。见上面的代码:

class Equipament extends Model {

 //Declaration of relation with Maintence
 public function maintences() {
  return $this->hasMany(Maintence::class);
 }

 //Ddeclaration of last Maintence relation filter
 public function lastMaintence() {
  return $this->maintences()->orderBy('id', 'desc')->limit(1);
 }

}

那么你可以这样使用:

$equipament = Equipament::with('lastMaintence')->find(1);
$lastMaintence = equipament->lastMaintence()->first();