在CakePHP中操作JOINS顺序

时间:2010-07-27 11:56:16

标签: cakephp join model

我对CakePHP有以下问题:

在我的模型中,存款属于帐户,而帐户属于客户。

查询存款时,默认情况下,我会收到帐户信息,但不会收到客户信息。

如果我将Deposit->递归设置为2,我会获得客户信息(以及更多信息),但CakePHP实际上每次存款都会抛出一个SELECT,这在这种情况下非常糟糕。

所以,我这样做了:

'joins' => array(
    array('table'=>'customers', 'alias'=>'Customer', 'type'=>'left', 'foreignKey' => false, 'conditions'=>array('Account.customer_id = Customer.id'))
)

几乎的作品......

我从中得到的是:

SELECT (...) FROM Deposits LEFT JOIN Customers LEFT JOIN Accounts

而不是

SELECT (...) FROM Deposits LEFT JOIN Accounts LEFT JOIN Customers

当然不起作用。

是否有指定“我的自定义连接”应该在“常规模型连接”之后? 或者我是否必须手动取消绑定来自帐户的存款,并手动指定两个连接?

谢谢!
丹尼尔

4 个答案:

答案 0 :(得分:2)

您可以使用Containable行为来选择您想要的内容,因此可以从您的存款控制器中选择:

$this->Deposit->find('all', array(
    // conditions
    'contain' => array('Account' => array('Customer'))
));

请务必将actsAs变量添加到课程中。这是更多信息。 http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

答案 1 :(得分:2)

您需要取消绑定要放在顶部的模型,并在“连接”数组中包含相应的数组。有关详细信息,请参阅this问题

答案 2 :(得分:0)

我意识到这是一个古老的问题,但它仍然具有相关性......

在添加新连接以满足关联之前,Cake会查看现有连接。在dbo_source.php中进行了一些挖掘(蛋糕1.3,也适用于2.x)我通过指定你的“连接”确切地说蛋糕如何构建它们,你可以有效地覆盖连接的顺序。

所以,在你的情况下:

'joins' => array(
array(
    'table' => '`accounts`', 
    'alias' => 'Account', 
    'type' => 'Left', 
    'conditions' => '`Deposit`.`account_id` = `Account`.`id`'
),
array(
    'table' => '`customers`', 
    'alias' => 'Customer', 
    'type' => 'Left', 
    'conditions' => '`Account`.`customer_id` = `Customer`.`id`'
)
)

使用in_array()执行此操作,请注意``围绕表和字段名称,LEFT的大小写,不要使用数组作为条件,因为这些是进行比较所必需的。

答案 3 :(得分:0)

我也遇到过这种情况,那时我几乎被困住了。在做了一些搜索后,我发现有两种方法可以做到。

  1. 编辑核心DboSource.php文件以更改连接顺序。 (How to change the sequence of 'joins' in CakePHP?

  2. 或者我们需要在$ joins数组中明确指定我们的关联。然后在查询中使用recursive -1。

  3. 我希望现在有可能的选择。如果您有任何其他有趣的方式,请在此发布!