Прежде всего, вы не можете получить желаемый результат с несколькими 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
содержит форматированный желаемый вывод.