Phalcon Model find()在另一个表中有条件

时间:2015-04-24 06:43:57

标签: php phalcon

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

但是我觉得我没有使用预定的方式来执行这些任务,所以如果你有更好的任务,请在下面回答。

2 个答案:

答案 0 :(得分:2)

您可能有两种方法:

1。通过queryBuilder

直接从模型加入很难实现。这就是设计queryBuilder的原因 - 模型仅在您愿意获取数据时查询数据,例如。通过访问所谓的加入$books->getStatus()。有关更多信息,请搜索文档:hudge example。还有一个关于优化here on SO的有用主题,所以你会知道为什么不总是直接使用模型是个好主意。

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()代替[],如果您之前使用的是PHP 5.4,那就有一些习惯了。

答案 1 :(得分:1)

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;