Global belongsTo在模型中定义的条件未应用(CakePHP v2.4.2)

时间:2013-11-28 12:55:30

标签: php sql cakephp model model-associations

为什么我的全局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;

3 个答案:

答案 0 :(得分:2)

在IRC合作后,我在自己的问题上找到了答案。

模型belongsTo条件中的条件似乎仅在查询JOIN时应用于Order

我试图针对特定角色过滤Party,例如AgentParty的别名,具有代理角色。因此,关联应该以角色设置为代理为条件。理想情况下,这会自动调整任何$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)
),