Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
Mysql 如何使用CodeIngiter将联接表查询结果调整为所需的JSON格式_Mysql_Json_Codeigniter - Fatal编程技术网

Mysql 如何使用CodeIngiter将联接表查询结果调整为所需的JSON格式

Mysql 如何使用CodeIngiter将联接表查询结果调整为所需的JSON格式,mysql,json,codeigniter,Mysql,Json,Codeigniter,假设我们有table person和table phone,它们之间的关系是一对多 我需要通过一个查询来检索类似的结果 [ { name:"abc", lname:"def", phones:[ { dial_code="+1", number:"12345667" }, { dial_code="+1", number:"12345667"

假设我们有table person和table phone,它们之间的关系是一对多

我需要通过一个查询来检索类似的结果

[
  {
    name:"abc",
    lname:"def",
    phones:[
        {
        dial_code="+1",
        number:"12345667"
        },
        {
        dial_code="+1",
        number:"12345667"
        }
      ]

  },
  {
    name:"xyz",
    lname:"lmn",
    phones[
       {
       dial_code="+2",
       number:"2643525"
       }
     ]
  },
  {...}

]
我可以通过多个查询来实现这一点,比如首先获取所有人,然后逐个获取他们的手机,但我认为这太奇怪了,需要很多时间,而且会降低性能。若我通过连接表获得所有数据,那个么它就不会像这个JSON格式

任何想法都将不胜感激


对不起,我的英语不好。

首先,您无法通过一个查询在每个人的手机中检索所需的结果

现在,如果有大量数据,在person循环中运行查询将极大地影响脚本的性能。通过这种方式,首先,您需要执行一个查询来获取所有personsay n个人。然后,您必须再次循环所有n个人以获取各自的电话。 因此,您需要在$persons循环内运行如下内容n次:

因此,您需要以这种方式执行n+1查询

为了克服这个n+1查询问题,我们可以应用一种称为“渴望加载”的方法。在这里,您还需要执行第一个查询来检索所有人员,然后编写一个查询来检索属于这些检索人员的所有电话:

SELECT * FROM person 
结果$人:

id      name
5       John
10      Bob
20      Jenna

SELECT * FROM phone WHERE person_id IN (5,10,20)
结果$电话:

id    person_id    dial_code   number
1     5            +2          12345
2     10           +1          12312
3     20           +1          98765
现在,我们将这两个结果合并到PHP脚本中,以生成所需的数组。这样,我们只编写两个查询,而不是n+1个查询

可以编写如下所示的PHP脚本来组合两个结果集:

// Create an array of phones with person_id as key
$phones_with_person_id_as_key = [];
foreach($phones as $key => $phone) {
    $phones_with_person_id_as_key[$phone->person_id][$key] = $phone;
}

// Loop $persons array and add phones to person object
foreach($persons as $key => $person) {
    // create phones key and add data
    if (!empty($phones_with_person_id_as_key[$person->id])) {
        $person->phones = $phones_with_person_id_as_key[$person->id];
    }
    else {
        $person->phones = [];
    }
}

现在,$persons包含格式化的所需输出。

即使您不知道如何做-@至少提供所需的数据表关系ID等。无论如何,尝试一种方法-如果您不尝试任何操作,在这里很难得到答案。。。你已经成为会员2年了,我想向你提出要求是合理的that@sintakonte我提到,我这样做是通过首先获取所有人,然后循环这些人并检索电话。我只是想知道是否可以通过减少查询数量来提高性能。我不知道我还应该提供什么数据?你说首先我需要获取所有的人,然后检索他们的ID,并使用IN子句进行另一次查询,以获取电话,然后检查哪些电话属于每个人?确切地说,您总共运行了两个查询,然后编写了一些脚本,以准备密钥中包含嵌套电话数据的person数组。以下是Laravel framework的文档链接,其中内置methodwith:
// Create an array of phones with person_id as key
$phones_with_person_id_as_key = [];
foreach($phones as $key => $phone) {
    $phones_with_person_id_as_key[$phone->person_id][$key] = $phone;
}

// Loop $persons array and add phones to person object
foreach($persons as $key => $person) {
    // create phones key and add data
    if (!empty($phones_with_person_id_as_key[$person->id])) {
        $person->phones = $phones_with_person_id_as_key[$person->id];
    }
    else {
        $person->phones = [];
    }
}