未应用模型中定义的条件的全局归属(CakePHP v2.4.2)

未应用模型中定义的条件的全局归属(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-&

为什么“我的全局属性”不适用于模型中定义的条件

我使用的是CakePHP v2.4.2

在modelOrder.php中

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问题: