Я использую красноречивый конструктор запросов, и я пытаюсь получить самый последний статус для каждого сервера, у меня есть таблица 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);
});
Опять же, любая помощь будет принята с благодарностью, спасибо за ваше время!
Обновлено:::
Я не лучший в 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
Я загрузил и использовал панель отладки инструмента, и мне кажется, что запрос к БД вообще не выполняется.
РЕДАКТИРОВАТЬ 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();
Какая у вас версия Laravel?
@JonasStaudenmeir laravel 5.6
Вы можете отлаживать запрос, используя -> toSql () и -> getBindings (). Ваш $query ->addSubSelect('last_status_date', ServerStatus::select('created_at') не закрыт. Вызов where () и latest () не содержится в подзапросе ...
Результат просто пустой или есть ошибка?
@JonasStaudenmeir пусто
@ Девон, ты можешь уточнить?
С какой стороны? Думаю, если вы посмотрите toSql (), вы поймете, о чем я говорю.
А Server::all() работает? Разве ->OrderBy('server_id') не должен быть ->OrderBy('servers.id')?
@devon Я только начал использовать панель отладки инструмента и нашел интересный результат. редактирование op, чтобы отразить мои выводы.
@JonasStaudenmeir изменился на это, и результат тот же.
Вы должны выполнить запрос с ->get().
@JonasStaudenmeir Достигнуты некоторые успехи, я опубликую обновленный код и снимок экрана с проблемой в OP
@JonasStaudenmeir, неважно, на мой взгляд, это была ошибка, теперь она работает, большое спасибо за помощь! если вы разместите мой код выше в качестве ответа, я приму






Я выложил решение с правкой исходного поста
Вы строите топовые сервера майнкрафт?))