Arrays to Json format

146
24 декабря 2018, 13:10

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
Answer 1

Задачу решил дополнительной функцией:

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.

READ ALSO
Прерывистая рамка

Прерывистая рамка

Как сделать такую прерывистую рамку?

175
Как делать сброс select по событию на чистом js?

Как делать сброс select по событию на чистом js?

Имеются textarea и selectМне нужно по событию paste в textarea сбрасывать select

172
Не работает footable

Не работает footable

У меня есть JSP страничка, на которую (не целевую пока что, тестовую) я хочу добавить таблицу footable:

212