获取laravel中每个服务器的最新状态

wsewodh2  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(269)

我正在使用雄辩的查询生成器,我试图获得每个服务器的最新状态,我有一个 servers 与我的表有一对多关系的表 server_statuses table。我当前的“解决方案”是基于laracon online advanced雄辩的演示,但它没有从我的数据库返回任何内容,下面是我的服务器模型、appserviceprovider和控制器。
我做错什么了?我好像想不通。
控制器:

$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);
});

再次任何帮助将不胜感激,谢谢您的时间!
编辑:::
我不是最擅长rawsql的,但这里是前面的rawsql应该是什么。

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

我下载并使用了debugbar工具,看起来db查询根本就没有执行过。

编辑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();
evrscar2

evrscar21#

我把解决方案和原来的帖子编辑在一起

相关问题