반응형
PHP MYSQL 중첩된 json으로 OneToMany 선택
두 개의 테이블이 있습니다. 하나는 고객 테이블이고 다른 하나는 주소 테이블이 그 사이에 하나 이상 있습니다.각 주소를 가진 모든 고객을 선택하고 다음과 같은 내용을 표시하려고 합니다.
{
id: 222,
name: John Doe,
age: 32,
addresses: [
{ id: 1, address: "some address", customer_id: 222 },
{ id: 2, address: "secondary address", customer_id: 222}
]
}
현재 내 코드는 다음과 같습니다.
$sql = "SELECT * FROM customers JOIN addresses ON customers.id = addresses.customer_id";
$result = $connection->query($sql);
$rows = array();
while ($row = $result->fetch_assoc()) {
$rows[] = $row;
}
print json_encode($rows);
그러나 데이터는 같지만 주소 속성은 다른 두 개의 레코드가 생성됩니다.어떻게 하면 상위 사례를 달성할 수 있을까요?
표본 데이터:
고객 테이블:
id | name | age
222 | John | 32
주소 테이블:
id | customer_id | address
1 | 222 | Some address
2 | 222 | Secondary address
현재 결과:
[
{
id: 222,
name: John,
age: 32,
address: Some address
customer_id: 222
},
{
id: 222,
name: John,
age: 32,
address: Secondary address
customer_id: 222
}
]
SQL 스크립트:
CREATE TABLE `customers` (
`id` bigint(20) NOT NULL,
`name` varchar(50) NOT NULL,
`age` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `addresses` (
`id` bigint(20) NOT NULL,
`address` varchar(150) NOT NULL,
`customer_id` bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `customers`
ADD PRIMARY KEY (`id`);
ALTER TABLE `customers`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
ALTER TABLE `addresses`
ADD PRIMARY KEY (`id`),
ADD KEY `customer_id` (`customer_id`);
ALTER TABLE `addresses`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
ALTER TABLE `addresses`
ADD CONSTRAINT `addresses_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
COMMIT;
INSERT INTO `customers` (`id`, `name`, `age`) VALUES
(1, 'John', 32);
INSERT INTO `addresses` (`id`, `address`, `customer_id`) VALUES
(1, 'Some address', 1),
(2, 'Secondary address', 1);
DB 측에서 문제를 해결해야 할 경우 사용할 수 있습니다.JSON_ARRAYAGG
쿼리의 함수:
SELECT
`customers`.`id`,
`customers`.`name`,
`customers`.`age`,
JSON_ARRAYAGG(`addresses`.`address`) AS `addresses`
FROM `customers`
JOIN `addresses` ON `customers`.`id` = `addresses`.`customer_id`
여기서 이 쿼리와 PHP 코드를 테스트할 수 있습니다.
PHP 솔루션은 다음과 같습니다.
<?php
$sql = "SELECT
`customers`.`id`,
`customers`.`name`,
`customers`.`age`,
`addresses`.`address`
FROM `customers`
JOIN `addresses` ON `customers`.`id` = `addresses`.`customer_id`
";
$result = $mysqli->query($sql);
$rows = array();
while ($row = $result->fetch_assoc()) {
if (is_array($rows[$row['id']])) {
array_push($rows[$row['id']]['address'],$row['address']);
} else {
$rows[$row['id']] = $row;
$rows[$row['id']]['address'] = (array)$rows[$row['id']]['address'];
}
}
var_export($rows);
언급URL : https://stackoverflow.com/questions/68314482/php-mysql-select-onetomany-as-a-nested-json
반응형
'programing' 카테고리의 다른 글
주석을 사용하여 이름별 스프링 빈 자동 배선 (0) | 2023.08.09 |
---|---|
신속한 코드 실행의 시작점은 무엇입니까? (0) | 2023.08.09 |
CSS 선택기/HTML 속성에 대시가 선호되는 이유는 무엇입니까? (0) | 2023.08.04 |
폴리곤 내 경계 상자 검색에 공간 인덱스가 사용되지 않음 (0) | 2023.08.04 |
상대 레이아웃에서 보기를 프로그래밍 방식으로 레이아웃하는 방법은 무엇입니까? (0) | 2023.08.04 |