Php 拉韦尔API返回

Php 拉韦尔API返回,php,laravel,Php,Laravel,我的Laravel应用程序有一些问题。 我列出了数据库中的一些数据,并调用了一个新函数来列出关于一些游戏服务器的更多信息。我成功地列出了所有需要的信息,但它的顺序不好 它又回来了 { "result": true, "server": [ { "id": 2512, "clientid": 2, "boxid": 23, "ipid": 60,

我的Laravel应用程序有一些问题。 我列出了数据库中的一些数据,并调用了一个新函数来列出关于一些游戏服务器的更多信息。我成功地列出了所有需要的信息,但它的顺序不好

它又回来了

{
    "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