LeanMapperQuery
Lean Mapper Query 1.3
Lean Mapper Query 是 Lean Mapper 库的查询对象的概念,它有助于使用自动连接构建复杂的查询(想法取自 NotORM 库)。查看建议的基类。有关捷克语文档,请查看 wiki。
SQL
预处理器,因此大多数 SQL 表达式都可用@book.tags.name
)它可以通过 Composer 安装。
composer require mbohuslavek/leanmapper-query
假设我们有以下存储库:
class BaseRepository extends LeanMapper Repository
{
public function find ( Query $ query )
{
$ this -> createEntities ( $ query
-> applyQuery ( $ this -> createFluent (), $ this -> mapper )
-> fetchAll ()
);
}
}
class BookRepository extends BaseRepository
{
}
以及以下实体:
/**
* @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
*/
class Book extends LeanMapper Entity
{
}
/**
* @property int $id
* @property string $name
* @property Book[] $books m:belongsToMany
*/
class Author extends LeanMapper Entity
{
}
我们构建一个查询:
$ query = new LeanMapperQuery Query ;
$ query -> where ( ' @author.name ' , ' Karel ' );
现在,如果我们想要获取作者姓名为 Karel 的所有书籍,我们必须这样做:
$ bookRepository = new BookRepository (...);
$ books = $ bookRepository -> find ( $ query );
数据库查询将如下所示:
SELECT [book]. *
FROM [book]
LEFT JOIN [author] ON [book].[author_id] = [author].[id]
WHERE ([author].[name] = ' Karel ' )
您可以看到它通过点符号执行自动连接。它支持Lean Mapper已知的所有关系类型。
SQL 函数的使用非常简单。我们可以像这样更新查询:
$ query -> where ( ' DATE(@pubdate) > %d ' , ' 1998-01-01 ' );
$ books = $ bookRepository -> find ( $ query );
它将数据库查询更改为以下内容:
SELECT [book]. *
FROM [book]
LEFT JOIN [author] ON [book].[author_id] = [author].[id]
WHERE ([author].[name] = ' Karel ' ) AND ( DATE ([book].[pubdate]) > ' 1998-01-01 ' )
您可以扩展Query
类并定义自己的方法。
class BookQuery extends LeanMapperQuery Query
{
public function restrictAvailable ()
{
$ this -> where ( ' @available ' , true )
-> orderBy ( ' @author.name ' );
return $ this ;
}
}
/////////
$ query = new BookQuery ;
$ query -> restrictAvailable ();
$ books = $ this -> bookRepository -> find ( $ query );
还可以查询实体属性(当前仅查询具有BelongsToMany
或HasMany
关系的属性)。让我们创建BaseEntity
类:
class BaseEntity extends LeanMapperQuery Entity
{
protected static $ magicMethodsPrefixes = [ ' find ' ];
protected function find ( $ field , Query $ query )
{
$ entities = $ this -> queryProperty ( $ field , $ query );
return $ this -> entityFactory -> createCollection ( $ entities );
}
}
/*
* ...
*/
class Book extends BaseEntity
{
}
请注意, BaseEntity
必须扩展LeanMapperQuery Entity
才能实现以下功能。
我们将find
方法定义为protected
因为通过在$magicMethodsPrefixes
属性中指定方法名称,您可以查询如下实体:
$ book ; // previously fetched instance of an entity from a repository
$ query = new LeanMapper Query ;
$ query -> where ( ' @name != ' , ' ebook ' );
$ tags = $ book -> findTags ( $ query );
神奇的方法findTags
最终将调用受保护的方法find
并将“tags”作为第一个参数。
生成的数据库查询如下所示:
SELECT [tag]. *
FROM [tag]
WHERE [tag].[id] IN ( 1 , 2 ) AND ([tag].[name] != ' ebook ' )
where
子句中的第一个条件[tag].[id] IN (1, 2)
取自实体遍历(针对该特定图书实体自己的标签查询标签)。
如果我们稍微修改BaseRepository
和BaseEntity
,我们可以简化查询对象的使用。要实现此目的,请查看建议的基类。它使以下成为可能。
$ books = $ bookRepository -> query ()
-> where ( ' @author.name ' , ' Karel ' )
-> where ( ' DATE(@pubdate) > ? ' , ' 1998-01-01 ' )
-> find ();
// or...
$ tags = $ book -> queryTags ()
-> where ( ' @name != ' , ' ebook ' )
-> find ();
版权所有 (c) 2013 Michal Bohuslávek
根据 MIT 许可证获得许可。