Skip to content
Michal Bohuslávek edited this page Mar 31, 2014 · 1 revision

Základní příkazy

Lean Mapper Query v out-of-the-box stavu disponuje následujícími příkazy:

  • where
  • orderBy
  • desc
  • asc
  • limit
  • offset

limit a 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, desc a asc

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.

where

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.

where se 2 argumenty

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');
  1. První řádek je napsán standardním způsobem.

  2. 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 flag m:type(date) (tento flag se tedy vyhledává pouze v těch property, které již jsou typu DateTime), 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.

  3. 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);
  4. Pokud je použitý operátor pro porovnání =, lze vynechat i ten. Na čtvrtém řádku je tedy nejkratší zápis.