Čá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 BYaniLIMITdo dotazu nepatří – o řazení i stránkování rozhoduje uživatel, takže je zdroj tiše zahodí (pevné pořadí se nastavuje přeshardOrder(), kapitola 24),- podmínky z filtrů přidá k vašemu
WHEREpřesAND, - počty počítá obalením dotazu do poddotazu, takže sedí i s
JOINaGROUP BY, - musí jít o jediný
SELECT(UNIONodmítne);SELECT *projde, aliasy si dopíše zinformation_schema.