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 許可證獲得許可。