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

时间:2018-06-26 13:29:42

标签: php mysql laravel laravel-5 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);
});

再次感谢您的帮助,谢谢您的宝贵时间!

编辑:::

我不是最擅长使用原始sql的人,但这是以前在原始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

我下载并使用了工具debugbar,似乎根本没有执行过数据库查询。

enter image description here

编辑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 :(得分:0)

我通过原始帖子的编辑发布了解决方案