现在我运行一个子查询来获取服务器的最新状态,这个子查询通过变量返回 last_status
.
//This is ran when WithLastStatusDate() is called
$query->addSubSelect('last_status', ServerStatus::select('status_id')
->whereRaw('server_id = servers.id')
->latest()
);
$servers = Server::WithLastStatusDate()
->OrderBy('servers.id', 'desc')
->where('servers.isPublic', '=', 1)
->get();
我现在要做的是对它执行一个join,这样它就会根据statuses表中的查询结果给出状态的实际名称。我试着做一个简单的左连接,但得到的错误是没有找到最后一个\u status列。
$servers = Server::WithLastStatusDate()
->OrderBy('servers.id', 'desc')
->where('servers.isPublic', '=', 1)
->leftjoin('statuses','servers.last_status', '=', 'statuses.id')
->get();
有谁能给我指出正确的方向来实现这个目标吗?
编辑:
服务器表:
Schema::create('servers', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('name');
$table->string('url');
$table->boolean('isPublic');
$table->timestamps();
});
服务器状态表:
Schema::create('server_statuses', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('server_id')->unsigned();
$table->foreign('server_id')->references('id')->on('servers')->onDelete('cascade');
$table->integer('status_id')->unsigned();
$table->foreign('status_id')->references('id')->on('statuses');
$table->timestamps();
});
状态表:
Schema::create('statuses', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('key');
$table->string('status');
$table->timestamps();
});
子查询后$servers的外观:
查询的原始sql:
select `servers`.*, (select `status_id` from `server_statuses` where server_id = servers.id order by `created_at` desc limit 1) as `last_status` from `servers` where `servers`.`isPublic` = '1' order by `servers`.`id` desc
编辑2::
$servers = DB::table('servers as sv')
->join('server_statuses as ss', 'sv.id', '=', 'ss.server_id')
->join('statuses as st', 'ss.status_id', '=', 'st.id')
->WithLastStatus()
->OrderBy('servers.id', 'desc')
->where('servers.isPublic', '=', 1)
->get();
3条答案
按热度按时间zhte4eai1#
因为我不确定你到底想从你的查询中得到什么,所以我将给出一个很长的解决方案并添加一些示例。有了这些表,您应该有以下模型:服务器模型:
状态模型:
示例:获取服务器的最后状态:
获取所有服务器状态:
获取服务器的特定状态:
获取具有特定状态的服务器:
希望你能找到答案。
6vl6ewon2#
据我所知,你们两个
Server
以及Status
模型有一个OneToMany
关系ServerStatus
. 在这种情况下,你可以假装OneToOne
你的关系Server
被选为最新一行的模型serverStatuses()
:然后还可以加载服务器的最新状态以及状态本身:
请注意
$server->latestServerStatus
不是集合而是一个对象,就像普通的OneToOne
关系。huwehgph3#
将左联接与子查询where子句组合: