未应用模型中定义的条件的全局归属(CakePHP v2.4.2)
为什么“我的全局属性”不适用于模型中定义的条件 我使用的是CakePHP v2.4.2 在modelOrder.php中:未应用模型中定义的条件的全局归属(CakePHP v2.4.2),php,sql,cakephp,model,model-associations,Php,Sql,Cakephp,Model,Model Associations,为什么“我的全局属性”不适用于模型中定义的条件 我使用的是CakePHP v2.4.2 在modelOrder.php中: public $belongsTo = array( ..., 'Agent' => array( 'className' => 'Party', 'foreignKey' => 'agent_id', 'conditions' => array(...) ), ... $agents = $this->Order-&
public $belongsTo = array(
...,
'Agent' => array(
'className' => 'Party',
'foreignKey' => 'agent_id',
'conditions' => array(...)
),
...
$agents = $this->Order->Agent->find('list');
在controllerOrdersController.php中:
public $belongsTo = array(
...,
'Agent' => array(
'className' => 'Party',
'foreignKey' => 'agent_id',
'conditions' => array(...)
),
...
$agents = $this->Order->Agent->find('list');
在渲染视图中,将应用以下SQL语句:
SELECT `Agent`.`id`, `Agent`.`name` FROM `zeevracht2`.`parties` AS `Agent` WHERE 1 = 1;
我尝试了不同的条件,但即使是一个包含true
的简单字符串也没有被应用(在$this->Order->Agent->find()中将此条件添加到partiescoller.php
时;
工作正常:
$agents = $this->Order->Agent->find('list', array(
'conditions' => array('true')
));
导致:
SELECT `Agent`.`id`, `Agent`.`name` FROM `zeevracht2`.`parties` AS `Agent` WHERE true;
如果您试图查找特定的
订单所属的代理
,那么您应该在查询订单时收回记录。例如:
<?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'));
,这是一个新的查询,它将获取所有没有条件的代理。传递true
的条件
键将没有影响,因为这不是一个条件。条件应该是一个数组,如下所示:
$this->Order->Agent->find('all', array(
'conditions' => array(
'Agent.id' => 1
)
));
但正如我所说,如果您的订单
模型属于您的代理
模型,那么当您获得订单
结果集时,您应该获得一个代理
结果集。如果不是,请尝试将可包含的行为添加到您的订单
模型:
<?php
class Order extends AppModel {
public $actsAs = array(
'Containable'
);
}
在与IRC合作后,我找到了自己问题的答案
在查询订单时,模型的belongsTo
条件中的条件似乎仅应用于连接
我试图筛选特定角色的参与方
,例如代理
,这是一个以角色为代理的参与方
的别名。因此,关联应以角色集为代理进行条件设置。理想情况下,这将自动条件设置任何$this->Order->Agent->find()
调用。但不幸的是,这是不可能的,因为CakePHP版本3的开发中正在解决一个技术问题
解决方案是在关联上有两种类型的条件:一种用于连接
,另一种用于关联本身
为什么要为加入?例如,当帖子属于用户,但只应显示Post.validated
。尝试以下操作:
public $belongsTo = array(
...,
'Agent' => array(
'className' => 'Party',
'foreignKey' => false,
'conditions' => array('joinField'=>'joinedField', ...more conditions)
),
我的条件是有效的,因为它是一个数组。我没有试图查找代理
一个订单
所属的。这是由CakePHP通过belongsTo
属性的foreignKey
选项自动完成的。我正在尝试使用设置为代理的角色筛选参与方。Containable通过AppModel
。我可以轻松地为每个$this->Order->Agent->find();
设置所需的条件,但我不想重复我自己(DRY)。我使用了大量的find()
调用,这是一个大型应用程序。条件=>数组('true'))
不是一个有效的条件数组。您实际上需要该数组中的一些条件。我们是在讨论技术正确性还是上下文有效性?我同意简单地传递数组('true'))
在其上下文中无效,因为您实际上需要一些条件。其中true
将始终计算为true
,就像其中1=1
,基本相同。这是为了测试目的。如果您愿意,我也可以使用[模型].id=1
。我也使用后者,这取决于我当时的感受;-)。但从技术角度看,这很好。CakePHP只是将数组中的任何独立字符串添加到WHERE子句中。我很想与您进一步讨论这个问题,但让我们关注这个问题。对于那些感兴趣的人:我创建了一个Github问题: