-
Notifications
You must be signed in to change notification settings - Fork 7
parsovani
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
).
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
.