Красноречивая группа запросов laravel по последнему идентификатору

Привет, я пытаюсь получить последний регистр в БД для каждого оборудования.

мне понравилось

id   | id_equip
-----+----------
   1 |    3
   2 |    3
   3 |    3
   4 |    2
   5 |    2

Я хочу запросить последний идентификатор каждого оборудования, например:

  id   | id_equip
  -----+----------
  3    |    3
  5    |    2

Я пробовал это:

$calibracao = $this->calibracao->orderBy('id', 'DESC')->groupBy('id_equip')->get();

Спасибо за помощь!


person Lucas Campos    schedule 24.10.2014    source источник
comment
ок, а в чем проблема? Какую ошибку вы получаете?   -  person Bogdan    schedule 24.10.2014
comment
Я хочу сделать заказ, но я получаю только первое из каждого снаряжения, а мне нужно последнее.   -  person Lucas Campos    schedule 24.10.2014


Ответы (3)


Простой способ, без 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>');
    }
}
person damiani    schedule 24.10.2014

Я не уверен, что есть более простой способ, и это довольно запутанно из-за 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();
person Bogdan    schedule 24.10.2014

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; 
    }

Это сработало, спасибо за помощь!

person Lucas Campos    schedule 27.10.2014