Lean Mapper Query هو مفهوم كائن استعلام لمكتبة Lean Mapper والذي يساعد في إنشاء استعلامات معقدة باستخدام الصلات التلقائية ( الفكرة مأخوذة من مكتبة NotORM ). انظر إلى الفئات الأساسية المقترحة. للحصول على الوثائق التشيكية قم بإلقاء نظرة على الويكي.
SQL
، وبالتالي تتوفر معظم تعبيرات SQL@book.tags.name
)ويمكن تثبيته عن طريق الملحن.
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 ' );
الآن، إذا أردنا الحصول على جميع الكتب التي اسم مؤلفها كاريل، علينا القيام بذلك:
$ 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 ();
حقوق الطبع والنشر (ج) 2013 ميشال Bohuslávek
مرخص بموجب ترخيص MIT.