PHP 7.2.8
mysql Ver 15.1 Distrib 10.1.26-MariaDB
Laravel Framework 5.6.29
Таблицы следующие:
CREATE TABLE `companys` (
`id` int(11) NOT NULL,
`company_name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB
CREATE TABLE `clients` (
`id` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
`company_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_clients_1_idx` (`company_id`),
CONSTRAINT `fk_clients_1` FOREIGN KEY (`company_id`) REFERENCES `companys` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB
CREATE TABLE `clients_values` (
`id` int(11) NOT NULL,
`value` varchar(45) DEFAULT NULL,
`client_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_clients_values_1_idx` (`client_id`),
CONSTRAINT `fk_clients_values_1` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB
Необходимо привести к такому JSON'у:
company_id: 1,
clients: [
{
client_id: '1',
client_name: 'Иванов И.И.',
client_values: [
{
value_id: 1,
value: '555'
},
{
value_id: 2,
value: '333'
},
],
},
{
client_id: '2',
client_name: 'Сидоров С.С.',
client_values: [
{
value_id: 4,
value: '888'
},
{
value_id: 5,
value: '999'
},
],
},
]
Пробую примерно так:
$companys = DB::select('SELECT * FROM companys WHERE id=1;');
$clients = DB::select('SELECT * FROM clients WHERE company_id=1');
$clients_values = DB::select('SELECT * FROM clients_values;');
$data = [
'id' => $companys[0]->id,
'type' => $companys[0]->name,
'clients' => [],
];
foreach ($funnel_steps as $key => $value) {
$data['clients'][$key] = [
'id' => $clients[$key]->id,
'name' => $clients[$key]->name,
'clients_values' => [],
];
}
foreach ($clients_values as $key => $value) {
$data['clients']['clients_values'][$key] = [
'id' => $clients_values[$key]->id,
'name' => $clients_values[$key]->value,
];
}
companys и client встают куда нужно, но не могу поставить clients_values, на свое место, как сопоставить id из clients, и client_id из clients_values?
Можно ли оптимизировать, и сделать такой JSON из одного запроса?
SELECT * FROM clients_values
INNER JOIN clients ON clients.id=clients_values.client_id
INNER JOIN companys ON companys.id=clients.company_id
Задачу решил дополнительной функцией:
foreach ($funnel_steps as $key => $value) {
$data['clients'][$key] = [
'id' => $clients[$key]->id,
'name' => $clients[$key]->name,
'clients_values' => $this->clientValuesToArray($clients[$key]->id),
];
}
Надеялся, что есть более оптимальное решение. Какая-нибудь хитрая функция, которая может преобразовать массив в многоуровневый json, понимая связи через Id.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Имеются textarea и selectМне нужно по событию paste в textarea сбрасывать select
У меня есть JSP страничка, на которую (не целевую пока что, тестовую) я хочу добавить таблицу footable: