Как настроить результат запроса объединенной таблицы в необходимом формате JSON с помощью CodeIngiter - PullRequest
0 голосов
/ 25 июня 2018

Предположим, у нас есть таблица person и таблица 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"
       }
     ]
  },
  {...}

]

Я могу сделать это с помощью нескольких запросов, например сначала получить все persons, а затем получить их phones один за другим, но я думаю, что это так странно и требует много времени и снижает производительность. и если я получу все данные, присоединившись к таблице, это будет не такой формат JSON.

Любая идея будет оценена.

Извините за мой плохой английский.

1 Ответ

0 голосов
/ 25 июня 2018

Прежде всего, вы не можете получить желаемый результат с несколькими phone внутри каждого person с помощью одного запроса.

Теперь выполнение запроса в цикле person сильно повлияет на производительностьскрипт, если данных много.Таким образом, во-первых, вам нужно выполнить запрос для получения всех людей (скажем, n человек).Затем вы должны снова зациклить всех n людей, чтобы получить их соответствующие телефоны.Таким образом, вам нужно выполнить что-то вроде следующего внутри $persons цикла n раз:

SELECT * FROM phone WHERE person_id = [$person_id]

Следовательно, таким образом вам нужно выполнить n+1 запросов.

Чтобы преодолеть это n+1 к проблеме запроса мы можем применить методологию, которая называется eager loading.Здесь вам также необходимо выполнить первый запрос для получения всех лиц, а затем написать запрос для получения всех телефонов, принадлежащих этим найденным лицам:

SELECT * FROM person 

Результат ($ лиц):

id      name
5       John
10      Bob
20      Jenna

SELECT * FROM phone WHERE person_id IN (5,10,20)

Результат ($ phones):

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 = [];
    }
}

Now $personsсодержит форматированный желаемый вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...