Skip to content
Michal Bohuslávek edited this page Apr 2, 2014 · 3 revisions

Vlastní příkazy

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í instanci LeanMapper\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 @field na odpovídající [tabulka].[sloupec]. Také umožňuje automatické joinování pomocí tečkové notace.

Příkazy pod pokličkou

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.

Příklad

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');

Clone this wiki locally