Получить самый последний статус для каждого сервера в laravel

Я использую красноречивый конструктор запросов, и я пытаюсь получить самый последний статус для каждого сервера, у меня есть таблица 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

Я загрузил и использовал панель отладки инструмента, и мне кажется, что запрос к БД вообще не выполняется.

Получить самый последний статус для каждого сервера в laravel

РЕДАКТИРОВАТЬ 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();

Вы строите топовые сервера майнкрафт?))

Dumitru 26.06.2018 15:35

Какая у вас версия Laravel?

Jonas Staudenmeir 26.06.2018 15:42

@JonasStaudenmeir laravel 5.6

Striker 26.06.2018 15:44

Вы можете отлаживать запрос, используя -> toSql () и -> getBindings (). Ваш $query ->addSubSelect('last_status_date', ServerStatus::select('created_at') не закрыт. Вызов where () и latest () не содержится в подзапросе ...

Devon 26.06.2018 15:48

Результат просто пустой или есть ошибка?

Jonas Staudenmeir 26.06.2018 15:50

@JonasStaudenmeir пусто

Striker 26.06.2018 15:50

@ Девон, ты можешь уточнить?

Striker 26.06.2018 15:51

С какой стороны? Думаю, если вы посмотрите toSql (), вы поймете, о чем я говорю.

Devon 26.06.2018 15:52

А Server::all() работает? Разве ->OrderBy('server_id') не должен быть ->OrderBy('servers.id')?

Jonas Staudenmeir 26.06.2018 15:53

@devon Я только начал использовать панель отладки инструмента и нашел интересный результат. редактирование op, чтобы отразить мои выводы.

Striker 26.06.2018 16:00

@JonasStaudenmeir изменился на это, и результат тот же.

Striker 26.06.2018 16:00

Вы должны выполнить запрос с ->get().

Jonas Staudenmeir 26.06.2018 16:06

@JonasStaudenmeir Достигнуты некоторые успехи, я опубликую обновленный код и снимок экрана с проблемой в OP

Striker 26.06.2018 16:12

@JonasStaudenmeir, неважно, на мой взгляд, это была ошибка, теперь она работает, большое спасибо за помощь! если вы разместите мой код выше в качестве ответа, я приму

Striker 26.06.2018 16:24
Стоит ли изучать 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
14
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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