【问题标题】:Return only the highest equipment maintenance id只返回最高的设备维护id
【发布时间】:2019-07-24 19:09:06
【问题描述】:

我想为equipament 获得最高的maintence_id 以显示给用户。我可以在 SQL 中做到这一点,但不能在 Eloquent 或 QueryBuilder 中。

Eloquent 返回我视图的所有维护:

$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 )

【问题讨论】:

    标签: php laravel eloquent laravel-query-builder


    【解决方案1】:

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

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

    【讨论】:

    • 我试试看!感谢您的帮助。
    【解决方案2】:

    我认为这就是你所关心的:

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

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

    【讨论】:

      【解决方案3】:

      试试看:

      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.*']);
      

      【讨论】:

      • 返回此错误:“SQLSTATE[42S22]: Column not found: 1054 Unknown column 'equipaments.id' in 'on Clause' (SQL: select maintences.* from maintences inner join (从维护组中选择 max(id) 作为 id,equipment_id 作为设备 ID,按设备 ID 顺序按 id desc 排序)sub.equipament_id = equipaments.id)
      【解决方案4】:

      遇到同样的问题here。 始终尽可能使用更简单的术语来搜索问题。其作品! :)

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

      【讨论】:

      • 感谢您的帮助拉斐尔。下次我会检查这个!
      猜你喜欢
      • 2014-08-15
      • 2014-12-05
      • 2023-03-03
      • 2023-03-12
      • 2011-09-12
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多