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