繁体   English   中英

在另一个表中具有条件的Phalcon模型find()

[英]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');
    }
}

我想提取所有状态描述为“丢失”的书。 这是我到目前为止的内容:

$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() 有关更多信息,请搜索文档: 轻举example 关于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:如果您以前使用过PHP 5.4,请使用array()代替[] ,这要养成一些习惯。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM