Я хочу получить наивысший maintence_id для equipament, чтобы показать пользователю. Я могу сделать это в SQL, но не в Eloquent или QueryBuilder.
Eloquent возвращает все необходимое для моего представления:
$equipament = Maintence::SELECT('maintences.*', 'equipaments.patrimony as patrimony')
->LEFTJOIN('equipaments', 'maintences.equipament_id', '=', 'equipaments.id' )
->get();
SQL возвращает наивысшее значение maintence_id для equipament:
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.*']);
Есть такая же проблема здесь. Всегда ищите проблему, используя как можно более простой термин. Это работает! :)
О проблеме. Почему max 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();
Я предполагаю, что ваши имена таблиц — equipments и maintenances, если нет, измените имена таблиц соответствующим образом в предоставленном запросе.
Я не рекомендую вам использовать внутренний запрос внутри предложения JOIN или либо в SELECT... Он будет запускать его для "каждой" строки. Лучше объявить в Model 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();
Я попробую! Спасибо за вашу помощь.
Возвратите эту ошибку: «SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «equipaments.id» в «предложении on» (SQL: выберите
maintences. * изmaintencesвнутреннего соединения (выберите max (id) как id,equipament_id какequipament_id из группы техобслуживания поequipament_id порядок по id desc) sub onsub.equipament_id=equipaments.id)