为什么我的全局belongsTo条件在未应用的模型中定义?
我正在使用CakePHP v2.4.2。
在模型 Order.php :
中public $belongsTo = array(
...,
'Agent' => array(
'className' => 'Party',
'foreignKey' => 'agent_id',
'conditions' => array(...)
),
...
在控制器 OrdersController.php :
中$agents = $this->Order->Agent->find('list');
在渲染视图中,正在应用以下 SQL语句:
SELECT `Agent`.`id`, `Agent`.`name` FROM `zeevracht2`.`parties` AS `Agent` WHERE 1 = 1;
我尝试了不同的条件,但即使是包含true
的简单字符串也未应用(在PartiesController.php
中将此条件添加到$this->Order->Agent->find();
时可以正常工作:
$agents = $this->Order->Agent->find('list', array(
'conditions' => array('true')
));
导致:
SELECT `Agent`.`id`, `Agent`.`name` FROM `zeevracht2`.`parties` AS `Agent` WHERE true;
答案 0 :(得分:2)
在IRC合作后,我在自己的问题上找到了答案。
模型belongsTo
条件中的条件似乎仅在查询JOIN
时应用于Order
。
我试图针对特定角色过滤Party
,例如Agent
,Party
的别名,具有代理角色。因此,关联应该以角色设置为代理为条件。理想情况下,这会自动调整任何$this->Order->Agent->find()
次呼叫。但不幸的是,由于CakePHP第3版的开发中遇到的技术问题,这是不可能的。
解决方案是在关联上有两种类型的条件:一种用于JOIN
,一种用于关联本身。
为什么选择JOIN
?例如。如果Post
属于User
,但只应显示post.validated
。
答案 1 :(得分:0)
如果您要查找特定Agent
所属的Order
,那么您应该在查询订单时获取记录。如下所示:
<?php
class OrdersController extends AppController {
public function view($id) {
$order = $this->Order->findById($id);
pr($order); exit;
}
}
应该产生类似的东西:
Array
(
[Order] => Array
(
[id] => 83
…
)
[Agent] => Array
(
[id] => 1
…
)
)
在您的问题中,您可以在其中进行额外的模型调用,例如$this->Order->Agent->find('list');
,即可进行新的查询,该查询将无条件地获取所有代理。传递conditions
的{{1}}密钥没有任何影响,因为这不是条件。条件应该是一个数组,如下所示:
true
但正如我所说,如果您的$this->Order->Agent->find('all', array(
'conditions' => array(
'Agent.id' => 1
)
));
模型属于您的Order
模型,那么当您获得Agent
结果集时,您应该获得Agent
结果集。如果没有,请尝试将可包含行为添加到Order
模型中:
Order
答案 2 :(得分:0)
试试这个:
public $belongsTo = array(
...,
'Agent' => array(
'className' => 'Party',
'foreignKey' => false,
'conditions' => array('joinField'=>'joinedField', ...more conditions)
),