Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL联接将联接数据作为数组返回_Php_Mysql_Pdo - Fatal编程技术网

Php SQL联接将联接数据作为数组返回

Php SQL联接将联接数据作为数组返回,php,mysql,pdo,Php,Mysql,Pdo,我试图在服务器端为前端制作一些好的结构数据 响应应该如下所示: [ { "id": "57484a7e0cdb86d125ebce9c", "wasCalled": true, "wasGood": false, "candidateName": "Tonia Santos", "positions": [ { "positionId": "48asd4

我试图在服务器端为前端制作一些好的结构数据

响应应该如下所示:

    [
      {
        "id": "57484a7e0cdb86d125ebce9c",
        "wasCalled": true,
        "wasGood": false,
        "candidateName": "Tonia Santos",
        "positions": [
          {
            "positionId": "48asd4asd36",
            "positionName": "Pozicia1"
          },
          {
            "positionId": "954asd5as4d",
            "positionName": "Pozicia4"
          }
        ],
        "addedBy": "User1",
        "registered": "2014-11-30T07:13:27 -01:00"
      }
  ]
class getCandidates
{
    public function getFromDatabase(){
        try {
            $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
            $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $sql = "SELECT * FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId;";
            $stmt = $con->prepare($sql);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        }catch( PDOException $e ) {
            return $e->getMessage();
        }

    }

    public function createJson($data){
        return json_encode($data);
    }
}
[{
    "id": "1",
    "firstName": "Tonia",
    "lastName": "Santos",
    "addedBy": "22",
    "wasCalled": "1",
    "wasGood": null,
    "candidateId": "1",
    "positionId": "1",
    "positionName": "Pozicia4"
},
{
    "id": "1",
    "firstName": "Tonia",
    "lastName": "Santos",
    "addedBy": "22",
    "wasCalled": "1",
    "wasGood": null,
    "candidateId": "1",
    "positionId": "1",
    "positionName": "Pozicia1"
}]
数据库结构:

    [
      {
        "id": "57484a7e0cdb86d125ebce9c",
        "wasCalled": true,
        "wasGood": false,
        "candidateName": "Tonia Santos",
        "positions": [
          {
            "positionId": "48asd4asd36",
            "positionName": "Pozicia1"
          },
          {
            "positionId": "954asd5as4d",
            "positionName": "Pozicia4"
          }
        ],
        "addedBy": "User1",
        "registered": "2014-11-30T07:13:27 -01:00"
      }
  ]
class getCandidates
{
    public function getFromDatabase(){
        try {
            $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
            $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $sql = "SELECT * FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId;";
            $stmt = $con->prepare($sql);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        }catch( PDOException $e ) {
            return $e->getMessage();
        }

    }

    public function createJson($data){
        return json_encode($data);
    }
}
[{
    "id": "1",
    "firstName": "Tonia",
    "lastName": "Santos",
    "addedBy": "22",
    "wasCalled": "1",
    "wasGood": null,
    "candidateId": "1",
    "positionId": "1",
    "positionName": "Pozicia4"
},
{
    "id": "1",
    "firstName": "Tonia",
    "lastName": "Santos",
    "addedBy": "22",
    "wasCalled": "1",
    "wasGood": null,
    "candidateId": "1",
    "positionId": "1",
    "positionName": "Pozicia1"
}]
  • 候选人:所有信息除外的职位

    |id | wascall | wasGood |由| firstName | lastName添加

  • 候选职位:每行是一个用户和一个职位

    |id |候选id |职位id |职位名称

我是如何尝试的:

    [
      {
        "id": "57484a7e0cdb86d125ebce9c",
        "wasCalled": true,
        "wasGood": false,
        "candidateName": "Tonia Santos",
        "positions": [
          {
            "positionId": "48asd4asd36",
            "positionName": "Pozicia1"
          },
          {
            "positionId": "954asd5as4d",
            "positionName": "Pozicia4"
          }
        ],
        "addedBy": "User1",
        "registered": "2014-11-30T07:13:27 -01:00"
      }
  ]
class getCandidates
{
    public function getFromDatabase(){
        try {
            $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
            $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $sql = "SELECT * FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId;";
            $stmt = $con->prepare($sql);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        }catch( PDOException $e ) {
            return $e->getMessage();
        }

    }

    public function createJson($data){
        return json_encode($data);
    }
}
[{
    "id": "1",
    "firstName": "Tonia",
    "lastName": "Santos",
    "addedBy": "22",
    "wasCalled": "1",
    "wasGood": null,
    "candidateId": "1",
    "positionId": "1",
    "positionName": "Pozicia4"
},
{
    "id": "1",
    "firstName": "Tonia",
    "lastName": "Santos",
    "addedBy": "22",
    "wasCalled": "1",
    "wasGood": null,
    "candidateId": "1",
    "positionId": "1",
    "positionName": "Pozicia1"
}]
它实际创建的内容:

    [
      {
        "id": "57484a7e0cdb86d125ebce9c",
        "wasCalled": true,
        "wasGood": false,
        "candidateName": "Tonia Santos",
        "positions": [
          {
            "positionId": "48asd4asd36",
            "positionName": "Pozicia1"
          },
          {
            "positionId": "954asd5as4d",
            "positionName": "Pozicia4"
          }
        ],
        "addedBy": "User1",
        "registered": "2014-11-30T07:13:27 -01:00"
      }
  ]
class getCandidates
{
    public function getFromDatabase(){
        try {
            $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
            $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $sql = "SELECT * FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId;";
            $stmt = $con->prepare($sql);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        }catch( PDOException $e ) {
            return $e->getMessage();
        }

    }

    public function createJson($data){
        return json_encode($data);
    }
}
[{
    "id": "1",
    "firstName": "Tonia",
    "lastName": "Santos",
    "addedBy": "22",
    "wasCalled": "1",
    "wasGood": null,
    "candidateId": "1",
    "positionId": "1",
    "positionName": "Pozicia4"
},
{
    "id": "1",
    "firstName": "Tonia",
    "lastName": "Santos",
    "addedBy": "22",
    "wasCalled": "1",
    "wasGood": null,
    "candidateId": "1",
    "positionId": "1",
    "positionName": "Pozicia1"
}]
有没有什么好的方法或最佳实践来创建类似于这个问题的JSON,而不必对数据库进行多次选择并构建JSON


感谢您提供的任何建议

您可以通过更改createJson方法来解析结果并获得所需的结果

    public function createJson($data){
        return_array = array();
        foreach($data as $val)
        {
          $return_array['id']= $val['id'];
          $return_array['candidateName']= $val['candidateName'];
          $return_array['wasCalled']= $val['wasCalled'];
          $return_array['wasGood']= $val['wasGood'];
          $return_array['addedBy']= $val['addedBy'];
          $return_array['positions'][] = array('positionId'=> $val['positionId'],'positionName'=>$val['positionName']);
        }
        return json_encode($return_array);
    }

您必须更改您的查询 我应该用

选择ID,如果(wascall=1,true,false)作为wascall,如果(wasGood=1,true,false)作为wasGood,

concat(firstName,' ',lastName) as candidateName, positionID, positionName,addedBy
顺便说一句,这只是一个部分的解决方案,你必须将这个方案与Deceptio的答案结合起来,才能得到最终的解决方案。 这是必要的,因为您没有candidateName字段,必须创建。
此外,请注意,addedBy返回一个ID,您希望名称与该ID绑定,因此我推断您还有一些其他表,您必须在其中提取此信息,因为您为相同的人获得多行,包含不同的位置,它可能看起来像(从我的脑海中输入,因此可能会出现一些错误,但请尝试一下并查看):


请注意
注册的
添加的注释

尽管您的问题已得到解决,但请务必查看以下答案,它更简洁明了

答复: 使用MySQL的
GROUPBY
GROUP\u CONCAT
子句,然后像这样更改查询

SELECT c.*, GROUP_CONCAT(cp.positionId, '|', cp.positionName) as positions 
FROM candidates as c 
INNER JOIN candidates_positions as cp 
ON c.id=cp.candidateId 
GROUP BY c.id
以下是参考资料:

因此,只需按以下方式更改
getFromDatabase()
方法

public function getFromDatabase(){
    try {
        $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
        $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        $sql = "SELECT c.*, GROUP_CONCAT(cp.positionId, '|', cp.positionName) as positions FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId GROUP BY c.id";
        $stmt = $con->prepare($sql);
        $stmt->execute();

        $result_arr = array();
        while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
            $tmp_arr = array('id' => $result['id'], 'wasCalled' => $result['wasCalled'], 'wasGood' => $result['wasGood'], 'addedBy' => $result['addedBy'], 'firstName' => $result['firstName'], 'lastName' => $result['lastName']);
            $positions = explode(",", $result['positions']);
            foreach($positions as $s){
                $components = explode("|", $s);
                $tmp_arr['positions'][] = array('positionId' => $components[0], 'positionName' => $components[1]);
            }
            $result_arr[] = $tmp_arr;
        }
        return $result_arr;
    }catch( PDOException $e ) {
        return $e->getMessage();
    }
}

稍后,您可以将返回的
$result\u arr
数组传递给
createJson()
方法,并在其上应用
json\u encode

这不是一个好的数组,因为数据库会返回每个位置的记录hi@theDeceptio感谢您的回答。我认为这不正确,它创建了对象数组,但不是返回2个候选位置,其中1有2个位置,2有1个位置,而是返回类似于ehttp://pastebin.com/WdZcUhYhHi @Oliver,我想你很接近了,但这不会返回对象数组。示例JSON看起来像:@Andurit好吧,就我所见,这是一个对象数组,但我确实搞乱了附加位置,我已经更新了那个位(答案中更新了代码)嘿,伙计,谢谢你的回答。我已经竖起大拇指,会思考这个问题。对我来说,作为一个能把他自己当成初学者的人,这比以前的答案看起来更干净。谢谢你!为什么你会使用<代码> GROPY-CONTAT < /代码>,和一个空间连起来?如果这个位置有空间查拉,代码就会崩溃。或者,如果
group\u concat()
正在使用任何东西,无论如何:您无法确定选择作为concat字符串传递的内容不会作为位置名称出现,因此破坏了
explode()
应该执行的逻辑。@OliverMaksimovic[1/2]1)您究竟为什么要使用group\u concat。。。?因为它使代码更加简洁和可视化,并且使操作更加容易。何况你为什么不呢?2) 如果位置中有空格字符,代码将崩溃。。。?根据OP的示例json字符串,positionName中没有空格,我在写这个答案时记住了这一点。然而,你可能是对的。假设positionName可能在某个地方有一个空格,我进一步更新了我的答案(不是空格,而是在…@OliverMaksimovic[2/2]…单独的对中添加了一个管道字符)。现在,在任何情况下都可以。