Возвращать только самый высокий идентификатор обслуживания оборудования

Я хочу получить наивысший 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 )
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
59
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Попробуй это:

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]: Столбец не найден: 1054 Неизвестный столбец «equipaments.id» в «предложении on» (SQL: выберите maintences. * из maintences внутреннего соединения (выберите max (id) как id,equipament_id какequipament_id из группы техобслуживания поequipament_id порядок по id desc) sub on sub.equipament_id = equipaments.id)

Augusto Von Grafen 24.07.2019 22:15

Есть такая же проблема здесь. Всегда ищите проблему, используя как можно более простой термин. Это работает! :)

О проблеме. Почему max ID, а не последняя версия оборудования, например? Проверьте, что вы действительно хотите, потому что идентификатор последовательности, например, не обязательно обновляется.

Спасибо за помощь, Рафаэль. Я проверю это в следующий раз!

Augusto Von Grafen 24.07.2019 22:50
Ответ принят как подходящий

Я думаю, это то, что вы ищете:

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

Я попробую! Спасибо за вашу помощь.

Augusto Von Grafen 25.07.2019 14:59

Другие вопросы по теме