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
拡張する必要があることに注意してください。
$magicMethodsPrefixes
プロパティにメソッド名を指定することで、次のようにエンティティをクエリできるため、 find
メソッドをprotected
として定義しました。
$ book ; // previously fetched instance of an entity from a repository
$ query = new LeanMapper Query ;
$ query -> where ( ' @name != ' , ' ebook ' );
$ tags = $ book -> findTags ( $ query );
マジック メソッドfindTags
最終的に、最初の引数として「tags」を指定して保護されたメソッドfind
を呼び出します。
結果のデータベース クエリは次のようになります。
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 ミハル・ボフスラヴェク
MITライセンスに基づいてライセンスされています。