我使用的是雄辩的查询生成器,并且试图获取每个服务器的最新状态,我有一个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,似乎根本没有执行过数据库查询。
编辑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();
答案 0 :(得分:0)
我通过原始帖子的编辑发布了解决方案