-
Notifications
You must be signed in to change notification settings - Fork 7
zakladni prikazy
Lean Mapper Query v out-of-the-box stavu disponuje následujícími příkazy:
where
orderBy
desc
asc
limit
offset
Tyto příkazy své argumenty pouze delegují na příslušné metody LeanMapper\Fluent
(tedy DibiFluent
). Očekávají int
a ovlivňují LIMIT
respektive OFFSET
klauzule v SQL dotazu. Použití tedy např.:
$query->limit(10)
->offset(20);
orderBy
přepokládá pouze 1 parametr, který je nejprve přeložen a následně delegován do DibiFluent::orderBy
. I zde je tedy možné použít tečkovou notaci.
$query->orderBy('@author.name DESC');
// nebo
$query->orderBy('@author.name')->desc();
Jak je vidět z příkladu, vzestupnost/sestupnost lze řešit buď přímo v metodě orderBy
, nebo na to použít pomocné funkce asc
a desc
.
Tento příkaz má oproti DibiFluent::where
to omezení, že musíme celou restrikci napsat pouze v prvním parametru. Předpokládá se tedy, že všechny ostatní parametry jsou pouze argumenty, které budou nahrazeny na místech příslušných modifikátorů (placeholderů).
// špatně
$query->where('@author.name = %s', 'Karel', 'OR @available', TRUE);
// správně
$query->where('@author.name = %s OR @available = %b', 'Karel', TRUE);
Při parsování argumentů příkazu where
totiž nelze rozlišit, zda-li se jedná o restrikci nebo pouze parametry.
Používání příkazu where
pouze se 2 argumenty je velice časté, proto byly vytvořeny jisté zkratky, které usnadňují jednoduché restrikce.
Následující řádky jsou ekvivalentní:
$query->where('@name = %s', 'PHP');
$query->where('@name = ?', 'PHP');
$query->where('@name =', 'PHP');
$query->where('@name', 'PHP');
-
První řádek je napsán standardním způsobem.
-
Na druhém řádku je vidět, že není nutné specifikovat konkrétní modifikátor, ale stačí použít výchozí (
?
). O zvolení správného modifikátoru se postará Lean Mapper Query, které typ modifikátoru určí podle typu property definované v entitě. Je tedy schopen rozlišit float, int, string.Speciální volbou je objekt
DateTime
, který ve výchozím stavu nahrazuje za modifikátor%t
, který tedy předpokládá datum i čas. Pokud by bylo zapotřebí uvažovat pouze datum, lze takovou property v entitě přidat ještě custom flagm:type(date)
(tento flag se tedy vyhledává pouze v těch property, které již jsou typuDateTime
), který způsobí nahrazení za modifikátor%d
.Je důležité zmínit, že tato náhrada modifikátorů funguje pouze u těchto jednoduchých volání příkazu
where
se 2 argumenty. Obecně to zatím nefunguje, protože není jisté, že za každou property (např.@author.name
) bude následovat jí příslušící modifikátor. -
Pokud nám vyhovuje výchozí mechanismus náhrady modifikátorů, můžeme modifikátor kompletně vynechat a na konci restrikce definovat pouze operátor. Lze tedy použít např.:
$query->where('@pubdate >=', new DateTime);
-
Pokud je použitý operátor pro porovnání
=
, lze vynechat i ten. Na čtvrtém řádku je tedy nejkratší zápis.