Phalcon 模型 find() with condition in another table

Phalcon Model find() with condition in another table

所以我有 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');
    }
}

我想提取所有具有状态描述 "lost" 的图书。这是我目前所拥有的:

$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 example. There was also an useful topic about optimisations ,这样您就会知道为什么不总是直接使用模型是个好主意。

2。通过创建一个单独的模型

为了让它简单、清晰但可能不是最明智的性能(取决于使用情况),因为不久前(Phalcon 1.3.2?)你可以创建一个单独的模型,其中包含 additional conditions(未测试示例):

class LostBooks extends Books {

    public function initialize() {
       $this -> belongsTo("status_id", "Status", "id",
       [
            'alias' => 'status',
            'params' => [
                'description' => 'lost'
            ]
       ]);
    }
}

通过正确声明,您可以通过

获得这些简单信息
$lostBooks = LostBooks::find();

PS:用array()代替[]的,如果你是PHP5.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;