Получить самый последний статус для каждого сервера в laravel - PullRequest
0 голосов
/ 26 июня 2018

Я использую 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

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

enter image description here

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();

1 Ответ

0 голосов
/ 26 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...