Lean Mapper Query เป็นแนวคิดของ วัตถุแบบสอบถาม สำหรับไลบรารี 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
เพื่อให้สิ่งต่อไปนี้เป็นไปได้
เราได้กำหนดวิธี 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
โดยมี 'แท็ก' เป็นอาร์กิวเมนต์ที่ 1
แบบสอบถามฐานข้อมูลผลลัพธ์มีลักษณะดังนี้:
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