Php 拉韦尔API返回
我的Laravel应用程序有一些问题。 我列出了数据库中的一些数据,并调用了一个新函数来列出关于一些游戏服务器的更多信息。我成功地列出了所有需要的信息,但它的顺序不好 它又回来了Php 拉韦尔API返回,php,laravel,Php,Laravel,我的Laravel应用程序有一些问题。 我列出了数据库中的一些数据,并调用了一个新函数来列出关于一些游戏服务器的更多信息。我成功地列出了所有需要的信息,但它的顺序不好 它又回来了 { "result": true, "server": [ { "id": 2512, "clientid": 2, "boxid": 23, "ipid": 60,
{
"result": true,
"server": [
{
"id": 2512,
"clientid": 2,
"boxid": 23,
"ipid": 60,
"ips": [
{
"id": 60,
"boxid": 23,
"ip": "178.63.45.131",
"usage": "Game Servers",
"created_at": null,
"updated_at": null
}
]
},
{
"id": 2385,
"clientid": 2,
"boxid": 20,
"ipid": 53,
"ips": [
{
"id": 53,
"boxid": 20,
"ip": "185.119.89.89",
"usage": "Game Servers",
"created_at": null,
"updated_at": null
}
]
}
],
"query": [
{
"server": {
"sv_version": "1.1.2.7/Stdio,48,2117",
"sv_voiceenable": "1",
"sv_wateraccelerate": "10",
"sv_waterfriction": "1",
"teams": [],
"version": "1.1.2.7/Stdio"
}
},
{
"server": {
"sv_version": "1.1.2.7/Stdio,48,1988",
"sv_voiceenable": "0",
"sv_wateraccelerate": "10",
"sv_waterfriction": "1",
"teams": [],
"version": "1.1.2.7/Stdio"
}
}
]
}
我希望它如何返回:
{
"result": true,
"server": [
{
"id": 2512,
"clientid": 2,
"boxid": 23,
"ipid": 60,
"ips": [
{
"id": 60,
"boxid": 23,
"ip": "178.63.45.131",
"usage": "Game Servers",
"created_at": null,
"updated_at": null
}
],
"query": [
{
"server": {
"sv_version": "1.1.2.7/Stdio,48,2117",
"sv_voiceenable": "1",
"sv_wateraccelerate": "10",
"sv_waterfriction": "1",
"teams": [],
"version": "1.1.2.7/Stdio"
}
]
},
{
"id": 2385,
"clientid": 2,
"boxid": 20,
"ipid": 53,
"ips": [
{
"id": 53,
"boxid": 20,
"ip": "185.119.89.89",
"usage": "Game Servers",
"created_at": null,
"updated_at": null
}
],
"query": [
{
"sv_version": "1.1.2.7/Stdio,48,1988",
"sv_voiceenable": "0",
"sv_wateraccelerate": "10",
"sv_waterfriction": "1",
"teams": [],
"version": "1.1.2.7/Stdio"
}
]
}
]
}
所以基本上它正确地返回了所有数据,唯一的问题是它单独列出了这些数据,但它应该在一个列表中。我的代码是这样的:
public function index(){
$user = auth()->user();
$servers = Server::where('clientid', $user->id)
->with('ips')
->orderBy('id', 'desc')
->get();
foreach ($servers as $key => $server) {
$boxid[$key] = $server->boxid;
$GameQ = new \GameQ\GameQ();
$GameQ->addServer([
'id' => 'server',
'type' => 'cs16',
'host' => $server->ips[0]->ip . ":" . $server->port
]);
$results[$key] = $GameQ->process();
$data[$key] = $server;
}
if ($user) {
$reposne['result'] = true;
$reposne['server'] = $data;
$reposne['query'] = $results;
} else {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $reposne;
}
问题
主要问题是何时何地放置查询值。在您的响应中,查询来自此
$reposne['query']=$results代码>。当您查看索引函数时,$results是在foreach循环期间创建的,如下所示$results[$key]=$GameQ->process()代码>$结果不会出现在代码的其他地方,因此查询值和服务器值永远不会混合
如何解决
在foreach循环期间,将查询值附加到服务器值
请尝试使用该代码:
public function index(){
$user = auth()->user();
$servers = Server::where('clientid', $user->id)
->with('ips')
->orderBy('id', 'desc')
->get();
foreach ($servers as $key => $server) {
$boxid[$key] = $server->boxid;
$GameQ = new \GameQ\GameQ();
$GameQ->addServer([
'id' => 'server',
'type' => 'cs16',
'host' => $server->ips[0]->ip . ":" . $server->port
]);
//Magic happen here
$server['query'] = $GameQ->process();
$data[$key] = $server;
}
if ($user) {
$reposne['result'] = true;
$reposne['server'] = $data;//And there
} else {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $reposne;
}
建议
实际上,在您的代码中,似乎您使用user只是为了知道某个用户是否经过身份验证。如果不是,则不希望执行此代码。我建议您尽早停止执行,因为您知道代码不应该被删除
public function index(){
if (Auth::check()) {
...
//your code
...
$reposne['result'] = true;
$reposne['server'] = $data;
return $reposne;
} else {
return response()->json(['error' => 'Unauthorized'], 401);
}
//If you prefer
if (!Auth::check()) {return response()->json(['error' => 'Unauthorized'], 401);}
...
//your code
...
$reposne['result'] = true;
$reposne['server'] = $data;
return $reposne;
}
您还可以在路由上使用auth中间件,以防止在用户未登录的情况下请求到达该代码段。
您的“查询”结构将插入到JSON的根目录中,并带有$reponse['query']=$results
,而不是$reponse['server']
结构的一部分。在对象构造过程中,您可能应该添加$results
,作为$GameQ->addServer()
调用的一部分。此外,在大多数地方,您可以命名$response
,但在else
块中可以拼写$response
。