Lean Mapper 쿼리는 자동 조인을 사용하여 복잡한 쿼리를 작성하는 데 도움이 되는 Lean Mapper 라이브러리용 쿼리 개체 개념입니다( NotORM 라이브러리에서 가져온 아이디어 ). 제안된 기본 클래스를 살펴보세요. 체코어 문서를 보려면 위키를 살펴보세요.
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 Michal Bohuslávek
MIT 라이센스에 따라 라이센스가 부여되었습니다.