我对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
当然不起作用。
是否有指定“我的自定义连接”应该在“常规模型连接”之后? 或者我是否必须手动取消绑定来自帐户的存款,并手动指定两个连接?
谢谢!
丹尼尔
答案 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)
我也遇到过这种情况,那时我几乎被困住了。在做了一些搜索后,我发现有两种方法可以做到。
编辑核心DboSource.php文件以更改连接顺序。 (How to change the sequence of 'joins' in CakePHP?)
或者我们需要在$ joins数组中明确指定我们的关联。然后在查询中使用recursive -1。
我希望现在有可能的选择。如果您有任何其他有趣的方式,请在此发布!