Produkty Objednávky Zákazníci Dokumentace
Nepřihlášen Uživatel 1 Uživatel 2 Uživatel 3
Část II · Zdroje dat

3.1. SQL šablona a aliasy

SQLDataSource dostane cestu k souboru s dotazem a doplní si do něj podmínky z filtrů, řazení i stránkování.

Ukázka

Sloupec Cena je v dotazu výraz (price / 100) – a přesto podle něj jde filtrovat i řadit.

Zdrojový kód

php app/Modules/AdminModule/Components/Docs/Data/SqlBasicsGridControl/SqlBasicsGridControl.php
<?php

declare(strict_types=1);

namespace App\Components\Docs\Data\SqlBasicsGridControl;

use Xart\Grid\Button\ButtonManager;
use Xart\Grid\Column\ColumnManager;
use Xart\Grid\Control\GridControl;
use Xart\Grid\DataOutput\Row;
use Xart\Grid\DataSource\DataSource;
use Xart\Grid\DataSource\SQL\SQLDataSource;

/**
 * Dokumentace, kapitola 3.1 – SQL šablona a aliasy.
 *
 * Aliasy sloupců gridu se musí shodovat s aliasy ve výsledku dotazu; `price` je v šabloně výraz
 * (haléře na koruny), a i tak se podle něj dá filtrovat i řadit.
 */
class SqlBasicsGridControl extends GridControl
{
    public function createDataSource(): DataSource
    {
        return new SQLDataSource(__DIR__ . '/SqlBasicsGridControl.sql');
    }


    public function columns(ColumnManager $cm): void
    {
        $cm->add('name', 'Název');
        $cm->add('category', 'Kategorie');
        $cm->addNumber('price', 'Cena', 2, 'Kč');
        $cm->addNumber('quantity', 'Skladem', 0);
    }


    public function buttons(ButtonManager $bm): void
    {
    }


    public function rows(Row $row): void
    {
    }


    public function render(): void
    {
        $this->template->render(__DIR__ . '/SqlBasicsGridControl.latte');
    }
}
sql app/Modules/AdminModule/Components/Docs/Data/SqlBasicsGridControl/SqlBasicsGridControl.sql
SELECT
    id,
    name,
    category,
    price / 100 AS price,
    quantity
FROM `product`

Aliasy

Alias v columns() se musí shodovat s aliasem ve výsledku dotazu; jinak grid místo tabulky napíše Datový zdroj neobsahuje sloupec s aliasem „…“. Výraz místo holého sloupce nevadí – do podmínek se dosazuje výraz (WHERE price / 100 >= ?), řadí se podle aliasu.

Dotaz musí vracet id (podle něj grid pozná řádky u akcí a modálů), i když z něj sloupec neděláte. Jiný název identifikátoru se nastavuje potomkem zdroje.

Co si zdroj s dotazem dovolí

  • ORDER BY ani LIMIT do dotazu nepatří – o řazení i stránkování rozhoduje uživatel, takže je zdroj tiše zahodí (pevné pořadí se nastavuje přes hardOrder(), kapitola 24),
  • podmínky z filtrů přidá k vašemu WHERE přes AND,
  • počty počítá obalením dotazu do poddotazu, takže sedí i s JOIN a GROUP BY,
  • musí jít o jediný SELECT (UNION odmítne); SELECT * projde, aliasy si dopíše z information_schema.