
V případě použití JOIN při získávání dat z databáze je možno použít pomocnou metodu createNestedStructure(), která je součástí helprů konkrétně \Moony\bootstrap\core\helpers\Database.
Metoda převede klasicky výstup z databáze, kde jsou všechny záznamy na jednom řádku a vytvoří z něj strukturu dle zadání.
Příklad: Máme uživatele (users), každý uživatel má přiřazené objednávky (orders) a každá objednávka má logy (orders_logs) a záznamy o změnách (orders_changes).
SELECT
users.id as users_id,
users.email,
orders.id as orders_id,
orders.product_id,
orders_logs.id as orders_logs_id,
orders_logs.order_id,
orders_logs.action,
orders_changes.id as orders_changes_id,
orders_changes.order_id,
orders_changes.action,
orders_changes.old_value,
orders_changes.new_value
FROM users
LEFT JOIN orders ON orders.user_id = users.id
LEFT JOIN orders_logs ON orders_logs.order_id = orders.id
LEFT JOIN orders_changes ON orders_changes.order_id = orders.id
WHERE users.id = 1
Nyní vytvoříme strukturu, ta se vytváří použitím metody uvedené výše a její první parametr je pole všech řádků z databáze a druhý parametr je daná struktura formou pole. Hodnoty v poli musí být stejné jako název daného sloupce (kromě nestovaných hodnot, ty si můžeš pojmenovat po svém, já dal před jejich název podtržítko).
use Moony\bootstrap\core\helpers\Database;
$rows = DB::fetchAll('SELECT ...');
$nested = Database::createNestedStructure($rows, [
'user_id',
'email',
'_orders' => [
'orders_id',
'product_id',
'_logs' => [
'orders_logs_id',
'order_id',
'action'
],
'_changes' => [
'orders_changes_id',
'order_id',
'action',
'old_value',
'new_value'
]
]
]);
Výsledek bude vypadat takto.
Array
(
[241] => Array
(
[user_id] => 241
[email] => muj@mail.com
[_orders] => Array
(
[5] => Array
(
[orders_id] => 5
[product_id] => 12411
[_logs] => Array
(
[344] => Array
(
[orders_logs_id] => 344
[order_id] => 5
[action] => Packet
)
[345] => Array
(
[orders_logs_id] => 345
[order_id] => 5
[action] => Shipped
)
)
[_changes] => Array
(
[8452] => Array
(
[orders_changes_id] => 8452
[order_id] => 5
[action] => Manually changed price
[old_value] => 299
[new_value] => 199
)
)
)
[12] => Array
(
[orders_id] => 12
[product_id] => 32541
[_logs] => Array
(
[547] => Array
(
[orders_logs_id] => 547
[order_id] => 12
[action] => Packet
)
[548] => Array
(
[orders_logs_id] => 548
[order_id] => 12
[action] => Shipped
)
)
[_changes] => Array
(
)
)
)
)
)