Phalcon Model find()的条件在另一个表中。[英] Phalcon Model find() with condition in another table

问题描述

所以我有两张这样的桌子

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 example.还有一个关于优化的有用主题here on 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()代替[]的,如果你是PHP 5.4之前的,有点习惯了.

本文地址:https://www.itbaoku.cn/post/1739779.html

相关标签/搜索