【问题标题】:Phalcon Model find() with condition in another tablePhalcon Model find() 与另一个表中的条件
【发布时间】:2015-04-24 06:43:57
【问题描述】:

所以我有两张这样的桌子

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
    ),
);

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

【问题讨论】:

  • 您已经在答案中找到了所需的一切,只需尝试一下。两者都是正确的。
  • 非常感谢,我似乎找不到很多关于 Phalcon 的答案,不确定它是否不受欢迎,或者太直截了当,我不够聪明。
  • Phalcon 是专为快速和同时提供服务而生的。用户范围狭窄且缺乏在线提示和技巧使我们成为专家,我对此感到满意;)

标签: php phalcon


【解决方案1】:

你有两种可能的方法:

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之前的,有点习惯了。

【讨论】:

  • 5.4 引入了短数组语法 []。如果他不需要支持 5.3 及以下版本,那么他不必担心。这是一件好事,因为 PHP 不正式支持 5.3 及以下版本...
【解决方案2】:
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;

【讨论】:

  • 第三种可能的方法 ;) 但会产生一个额外的查询。
猜你喜欢
  • 2013-09-27
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 2018-08-25
  • 2010-12-17
  • 2018-03-05
相关资源
最近更新 更多