Php MySQL присоединиться к subarray с именами полей

Я пытаюсь объединить таблицу, используя один запрос в подмассив с именем столбца => значение столбца ..

Краткая таблица (1) «Пользователи» структура с данными:

user_id   email        ...
1         xxx@xx.xx    ...
2         yyy@yy.yy    ...

Краткая таблица (2) структура «users_permissions» с данными:

user_id   plugin_enter  offers_view  ...
1         1             0             ...
2         1             1             ...

Если я использую классический метод — присоединиться слева

SELECT `uperms`.*, `u`.*
FROM (`users` as u)
LEFT JOIN `users_permissions` as uperms ON `u`.`user_id` = `uperms`.`user_id`

Я получаю классический выход

[0] = array(
'user_id' => 1,
'email' => xxx@xx.xx,
'plugin_enter' => 1,
'offers_view' => 0
),
[1] = array(
'user_id' => 2,
'email' => yyy@yy.yy,
'plugin_enter' => 1,
'offers_view' => 1,
...
),

Все, что мне нужно, это вывод в subarray, как это:

[0] = array(
'user_id' => 1,
'email' => xxx@xx.xx,
'permissions => array(
'plugin_enter' => 1,
'offers_view' => 0
),
),
...

Это возможно сделать с одним запросом?

Таблица 2 (разрешения) содержит около 60 столбцов. Можно ли сопоставлять имена столбцов со значением столбца, если к таблице 1 присоединена только одна строка?

2

Решение

MySQL не имеет массивов или вложенных структур, поэтому это невозможно сделать в SQL.

Измените свой запрос, чтобы вы дали все поля из users_permissions последовательный стиль именования. Затем вы можете использовать цикл PHP для сбора всех элементов массива, ключи которых соответствуют этому шаблону, в permissions массив.

Запрос:

SELECT u.*, up.plugin_enter AS perm_plugin_enter, up.offers_view AS perm_offers_view, ...
FROM users AS u
JOIN users_permissions AS up ON u.user_id = up.user_id

PHP:

foreach ($all_results as &$row) {
$permissions = array();
foreach ($row as $key => $value) {
if (strpos($key, 'perm_') === 0) {
$permission[substr($key, 5)] = $value;
unset($row[$key]);
}
}
$row['permissions'] = $permissions;
}

Вы можете сделать это путем объединения всех имен столбцов и значений в таблице:

SELECT u.*, CONCAT_WS(',', CONCAT('plugin_enter:', plugin_enter), CONCAT('offers_view:', offers_view), ...) AS permissions
FROM users AS u
JOIN users_permissions AS up ON u.user_id = up.user_id

Тогда ваш код PHP может использовать explode() разделять $row['permissions'] в массив name:value пары, а затем преобразовать их в key=>value в массиве PHP.

Еще одно решение — изменить дизайн вашего users_permissions Таблица:

user_id permission_type value
1       plugin_enter    1
1       offers_view     0
...
2       plugin_enter    1
2       offers_view     1
...

Затем вы можете запросить:

SELECT u.*, GROUP_CONCAT(permission_type, ':', value) AS permission
FROM users AS u
JOIN users_permissions AS up on u.user_id = up.user_id
1

Другие решения

Другое возможное решение — добавить префиксы к запросу.
Вдохновленный почтой: https://stackoverflow.com/a/9926134/2795923

SELECT `u`.*, ':prefix_start:', `uperms`.*, ':prefix_end:'
FROM (`users` as u)
LEFT JOIN `users_permissions` as uperms ON `u`.`user_id` = `uperms`.`user_id`

Выходной массив выглядит так:

[0] => array(
'user_id' => 1
'email' => xxx@xx.xx,
'prefix_start' =>
'plugin_enter' => 1,
'offers_view' => 0
'prefix_end' =>
)
...

Затем простой PHP-скрипт для добавления всех данных массива между prefix_start и prefix_end в собственный подмассив.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector