в sql запросить этот коммандос сделать именно то, что я хотел:
SELECT
v.id,
(
SELECT sv.status_id
FROM status_viagem sv
WHERE sv.viagem_id = v.id
ORDER BY sv.created_at DESC LIMIT 1 ) AS status_id
FROM viagens v
Вот результаты sql:
Но я понятия не имею, как я могу сделать это, используя Laravel eloquent
В принципе, запись в viagem может иметь много состояний, но мне нужно получить каждый viagem и их последний статус запись из таблицы status_viagem (сводная таблица)
по пути viagem / viagens означает путешествие.
Отображение моего класса:
class Viagem extends Model
{
...
public function status()
{
return $this->belongsToMany('App\Status')->withTimestamps();
}
...
}
class Status extends Model
{
public function viagens()
{
return $this->belongsToMany('App\Viagem')->withTimestamps();
}
}
В обоих классах принадлежащие мне люди получают много ко многим:
Может ли кто-нибудь мне помочь? спасибо
---------- Временное решение -------
Спасибо за помощь, ребята. На самом деле я не могу найти хорошее решение, используя только красноречивый.
Шаг 1/3 - Чтобы обойти эту ситуацию, я сначала выполняю вышеописанное sql, чтобы захватить только проходы под желаемым status_id (последняя запись status_viagem):
$viagens_ids = DB::select(
"SELECT viagem_id FROM (
SELECT
v.id AS viagem_id,
(
SELECT sv.status_id
FROM status_viagem sv
WHERE sv.viagem_id = v.id
ORDER BY sv.id DESC LIMIT 1 ) AS status_id
FROM viagens v
) AS tt
WHERE tt.status_id = {$status->id}"
);
Шаг 2 / 3 - затем я использовал array_map для организации своих идентификаторов viagens
$a = array_map(
function($obj) { return $obj->viagem_id; },
$viagens_ids
);
Шаг 3/3 - И наконец, я использовал elequent whereIn для получения моих viagens:
Viagem::with( 'status')->whereIn('id', $a)->get();
Фактически я Я решил эту проблему по-старому, но я не доволен этим, потому что я sh узнаю, как это сделать, используя eloquent. что плохо для меня.