поэтому у меня есть 2 таблицы, подобные этому
books id name status_id ------------------------------- 1 a 0 2 b 2 ... status id description --------------------- 0 borrowed 1 available 2 lost
Модели Phalcon
class Books extends ModelBase { public function initialize() { $this -> belongsTo("status_id", "Status", "id"); } } class Status extends ModelBase { public function initialize() { $this -> hasMany('id', "Books", 'status_id'); } }
Я хотел бы извлечь все книги, которые имеют статус «потерянный». Это то, что у меня есть до сих пор:
$lostBooks = Books::find( 'conditions' => "description=:status:", 'bind' => array( 'status' => 'lost' ), );
Обновление: я получил то, что хочу, используя обходной путь
$lostStatus = Status::findFirst("description='Closed'"); $lostBooks = Books::find( 'conditions' => "status_id=:id:", 'bind' => array( 'id' => $lostStatus -> id ), );
Однако я чувствую, что не использую намеченный способ выполнения таких задач, поэтому, если у вас есть лучший, ответьте ниже.
У вас есть два подхода:
queryBuilder
Присоединения непосредственно от моделей трудно достичь. Именно поэтому был разработан queryBuilder
– модели запрашивают данные только в том случае, если вы готовы их получить, например. путем доступа к якобы соединенным $books->getStatus()
. Для получения дополнительной информации найдите документацию: пример hudge . Была также полезная тема об оптимизации здесь на SO , поэтому вы узнаете, почему не всегда прямое использование моделей – хорошая идея.
Чтобы сделать его простым, ясным, но, возможно, не самым высоким по производительности (зависит от использования), так как недавно (Phalcon 1.3.2?) Вы можете создать отдельную модель с дополнительными условиями в ней (не тестируемый пример):
class LostBooks extends Books { public function initialize() { $this -> belongsTo("status_id", "Status", "id", [ 'alias' => 'status', 'params' => [ 'description' => 'lost' ] ]); } }
С этим должным образом заявленным вы можете получить эти простые
$lostBooks = LostBooks::find();
PS: используйте array()
вместо []
of, если вы раньше PHP 5.4, получили некоторые привычки.
class Books extends ModelBase { public function initialize() { $this->belongsTo('status_id', 'Status', 'id'); } } class Status extends ModelBase { public function initialize() { $this->hasMany('id', 'Books', 'status_id', array('alias' => 'books') ); } } $lostBooks = Status::findFirst("description = 'lost'")->getBooks(); $lostBooks = Status::findFirst("description = 'lost'")->books;