-
Notifications
You must be signed in to change notification settings - Fork 7
vlastni prikazy
Kromě základních příkazů, které jsou již přítomny, lze do vlastního query objektu definovat vlastní příkazy. Pro definování vlastního příkazu musíte vytvořit zpravidla protected metodu command<JménoPříkazu>($parametry). Potom máte k dispozici následující API:
- Metodu
$this->getFluent(), která vrací instanciLeanMapper\Fluent, jejíž úpravou docílíte kýženého chování vlastního příkazu query objektu. - Metodu
$this->parseStatement($statement), která převádí vysokoúrovňová data@fieldna odpovídající[tabulka].[sloupec]. Také umožňuje automatické joinování pomocí tečkové notace.
Při volání příkazů nad query objektem se jednotlivé příkazy zařazují do fronty příkazů. Příkazy se provedou teprve ve chvíli, kdy je zavolána metoda applyFluent($fluent, $mapper), která poskytne příkazům potřebný Fluent, který pak mohou upravovat.
Je tedy rozdíl mezi definicí vlastního příkazu a definicí use case metody, která příkazy používá. Use case metody lze definovat normálním způsobem jako public, jelikož tyto metody pouze volají příkazy, které se teprve zařazují do fronty. Rozhodně ale není možné používat u těchto metod $this->getFluent. Od toho tu jsou právě vlastní příkazy.
Budeme chtít implementovat agregační funkci MAX spolu s GROUP BY.
/**
* @method BaseQuery max(string $field)
* @method BaseQuery groupBy(string $field)
*/
class BaseQuery extends LeanMapperQuery\Query
{
protected function commandMax($field)
{
$statement = $this->parseStatement($field);
$this->fluent->select("MAX($statement)");
}
protected function commandGroupBy($field)
{
$statement = $this->parseStatement($field);
$this->fluent->groupBy($statement);
}
}Nyní můžeme nad takovým query objektem používat tyto vlastní příkazy.
$query = new BaseQuery;
$query->max('@pubdate')
->groupBy('@author');