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

Parsování příkazů

Hlavní feature Lean Mapper Query je parsování příkazů, které překládá vysokoúrovňové názvy entit a jejich property na nízkoúrovňové názvy tabulek a sloupců. Překládají se názvy začínající @, pokud se tedy @ nevyskytuje v uvozovkách.

Ukažme si chování na příkladu. Mějme následující entity:

/**
 * @property int $id
 * @property string $name
 */
class Tag extends LeanMapper\Entity
{
}

/**
 * @property int $id
 * @property Author $author m:hasOne
 * @property Tag[] $tags m:hasMany
 * @property DateTime $pubdate
 * @property string $name
 * @property bool $available (disposable)
 */
class Book extends LeanMapper\Entity
{
}

/**
 * @property int $id
 * @property string $name
 * @property Book[] $books m:belongsToMany
 */
class Author extends LeanMapper\Entity
{
}

a následující repozitáře:

class BaseRepository extends LeanMapper\Repository
{
	public function find(IQuery $query)
	{
		$this->createEntities($query
			->applyQuery($this->createFluent(), $this->mapper)
			->fetchAll()
		);
	}
}

class BookRepository extends BaseRepository
{
}

Řekněme, že chceme pouze dostupné knihy:

$query = new LeanMapperQuery\Query;
$query->where('@available', TRUE);
$availableBooks = $bookRepository->find($query);

Dotaz pak vypadá následovně:

SELECT [book].*
FROM [book]
WHERE ([book].[disposable] = 1)

Tedy @available se nahradí za příslušnou tabulku a příslušný sloupec (název tohoto sloupce se neshodoval s názvem property, jak je vidět u definice entity Book).

Tečková notace

Při vybírání dat z repozitáře jsou občas zapotřebí komplikovanější dotazy, které často využívají informací ze souvisejících tabulek. Pro takové dotazy Lean Mapper Query disponuje automatickým joinování pomocí tečkové notace.

$query = new LeanMapperQuery\Query;
$query->where('@author.name', 'Karel');
$books = $bookRepository->find($query);

Tímto způsobem vybereme všechny knihy, jejichž autor se jmenuje Karel.

SELECT [book].*
FROM [book]
LEFT JOIN [author] ON [book].[author_id] = [author].[id]
WHERE ([author].[name] = 'Karel')

Z SQL dotazu je nyní vidět, že k tomuto úkonu bylo zapotřebí provést LEFT JOIN do tabulky autorů, který byl proveden automaticky. Z výrazu @author.name Lean Mapper Query určil, že potřebujeme provést restrikci na jméno z entity Author, takže napřed provedl join do tabulky author a poté restrikci na jeho jméno.

Do souvisejících entit můžeme přes tečkovou notaci přistupovat v libovolné hloubce až do neúnosné náročnosti SQL dotazu. Lze tedy i šílenosti jako @author.comments.repliers.reviewedBooks.name.

Clone this wiki locally