Я использую eloquent построитель запросов и пытаюсь получить самый последний статус для каждого сервера, у меня есть таблица servers
, которая имеет отношение один ко многим с моей таблицей server_statuses
. Мое текущее «решение» основано на расширенной красноречивой презентации laracon, но оно ничего не возвращает из моей базы данных, ниже прилагается модель моего сервера, AppServiceProvider и Controller.
Что я здесь не так делаю? Я не могу понять это.
Контроллер:
$recent = Server::WithLastStatusDate()
->OrderBy('server_id');
Модель:
public function scopeWithLastStatusDate($query){
$query ->addSubSelect('last_status_date', ServerStatus::select('created_at')
->whereRaw('server_id = servers.id')
->latest()
);
}
AppServiceProvider:
Builder::macro('addSubSelect', function ($column, $query) {
if (is_null($this->getQuery()->columns)) {
$this->select($this->getQuery()->from.'.*');
}
return $this->selectSub($query->limit(1)->getQuery(), $column);
});
Опять же, любая помощь будет высоко ценится, спасибо за ваше время!
EDIT :::
Я не лучший в raw sql, но вот что должно быть в raw sql.
SELECT "servers".*, (SELECT "created_at" FROM "server_statuses" WHERE server_id = servers.id ORDER by "created_at" DESC LIMIT 1) as "last_server_status" FROM "servers" ORDER BY servers.id
Я скачал и использовал панель отладки инструмента, и кажется, что запрос к БД вообще никогда не выполняется.
EDIT 2 :: Теперь изменили модель и контроллер, я получаю все общедоступные серверы, но он также возвращает серверы, которые не имеют статуса.
Модель обновлена:
public function scopeWithLastStatusDate($query){
$query->addSubSelect('last_status_date', ServerStatus::select('servers.name')
->whereRaw('server_id = servers.id')
->latest()
);
}
Обновлен контроллер:
$servers = Server::WithLastStatusDate()
->OrderBy('servers.id')
->where('servers.isPublic', '=', 1)
->get();