我正在使用雄辩的查询生成器,我试图获得每个服务器的最新状态,我有一个 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();
1条答案
按热度按时间evrscar21#
我把解决方案和原来的帖子编辑在一起