Phalcon Model find () с условием в другой таблице

поэтому у меня есть 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 ), ); 

Однако я чувствую, что не использую намеченный способ выполнения таких задач, поэтому, если у вас есть лучший, ответьте ниже.

У вас есть два подхода:

1. Через queryBuilder

Присоединения непосредственно от моделей трудно достичь. Именно поэтому был разработан queryBuilder – модели запрашивают данные только в том случае, если вы готовы их получить, например. путем доступа к якобы соединенным $books->getStatus() . Для получения дополнительной информации найдите документацию: пример hudge . Была также полезная тема об оптимизации здесь на SO , поэтому вы узнаете, почему не всегда прямое использование моделей – хорошая идея.

2. Через создание отдельной модели

Чтобы сделать его простым, ясным, но, возможно, не самым высоким по производительности (зависит от использования), так как недавно (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;