Moony
PHP Framework

JOIN-s Nested Structure

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'
        ]
    ]
]);
První položka v poli (i v nestovaných) musí být unikátní, nejlépe auto increment key, v tomto případě je to user_id, v _orders to je orders_id v _logs to je orders_logs_id a v _changes to je orders_changes_id. Je to z toho důvodu, protože se k danému ID přiřazují další a další záznamy.

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
                        (
                        )

                  )

            )

      )

)