SQL strategie
Lean Mapper sestavuje dotazy „v duchu NotORM“, a proto načítá jedním dotazem související knihy pro všechny autory, které jsme získaly např. při volání $authorRepository->fetchAll()
. Podle výchozí strategie tedy připraví následující dotaz (vyobrazená ID samozřejmě závisí na konkrétních datech v databázi):
SELECT `book`.* FROM `book` WHERE `book`.`author_id` IN (11, 12)
Všimněte si operátoru IN
v SQL dotazu - díky němu je výchozí strategie nazývána jako „IN strategie“.
Pokud bychom do tohoto dotazu přidali, např. pomocí filtru, klauzuli LIMIT 1
, dostaneme jiný výsledek, než jaký jsme původně zamýšleli. Nechceme limitovat výsledek s knihami pro všechny autory. To, co potřebujeme, je, aby Lean Mapper položil do databáze trochu odlišný dotaz:
(SELECT `book`.* FROM `book` WHERE `book`.`author_id` = 11 LIMIT 1)
UNION
(SELECT `book`.* FROM `book` WHERE `book`.`author_id` = 12 LIMIT 1)
Díky tomu získáme to, co jsme chtěli - jednu knihu pro každého autora.
Tento způsob dotazování nazýváme jako „UNION strategii“. UNION strategii aktivujeme u konkrétních vazeb m:hasMany
, m:belongsToMany
a m:belongsToOne
pomocí dovětku #union
. Výše uvedený příklad s limitováním knih bychom zapsali takto:
class CommonFilter
{
public static function limit(LeanMapper\Fluent $fluent, $limit)
{
$fluent->limit($limit);
}
}
$connection->registerFilter('limit', ['CommonFilter', 'limit']);
/**
* @property int $id
* @property string $name
* @property Book[] $books m:belongsToMany(#union) m:filter(limit#1)
*/
class Author extends LeanMapper\Entity
{
}
Všimněte si dovětku #union
, který zakončuje definici vazby - validní jsou i zápisy m:belongsToMany(author_id#union)
, m:belongsToMany(author_id:author#union)
, apod.
Poznámka: Dodejme, že získávání dat přes UNION strategii je zapotřebí jen opravdu zřídka.
SQL strategie a filtry
Při použití filtrů je každý filtr aplikován na každou samostatnou část UNION dotazu - viz příklad výše, kdy je filtrem přidána klauzule LIMIT
do každé části dotazu.
« Integrace Lean Mapperu do aplikace | Systém událostí » |