CakePHP中连接顺序的处理
我对CakePHP有以下问题: 在我的模型中,存款属于账户,账户属于客户 查询存款时,默认情况下,我会获取帐户信息,但不会获取客户的信息 如果我将Deposit->recursive设置为2,我将获得客户信息(以及更多),但是CakePHP本质上会在每次存款中抛出一个SELECT,这在这种情况下非常糟糕 所以,我这样做了:CakePHP中连接顺序的处理,cakephp,join,model,Cakephp,Join,Model,我对CakePHP有以下问题: 在我的模型中,存款属于账户,账户属于客户 查询存款时,默认情况下,我会获取帐户信息,但不会获取客户的信息 如果我将Deposit->recursive设置为2,我将获得客户信息(以及更多),但是CakePHP本质上会在每次存款中抛出一个SELECT,这在这种情况下非常糟糕 所以,我这样做了: 'joins' => array( array('table'=>'customers', 'alias'=>'Customer', 'type'=
'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
这当然行不通
是否仍要指定“我的自定义联接”应位于“常规模型联接”之后?或者我必须手动解除存款与帐户的绑定,并手动指定两个联接吗 谢谢
Daniel您可以使用可控制行为选择您想要的内容,因此从存款控制器:
$this->Deposit->find('all', array(
// conditions
'contain' => array('Account' => array('Customer'))
));
只需确保将
actsAs
变量添加到类中即可。这里有更多信息 您需要取消绑定希望位于顶部的模型,并在“连接”数组中包含适当的数组。详见问题我意识到这是一个老问题,但它仍然是相关的
在添加新联接以满足关联之前,Cake会检查现有联接。在深入研究dbo_source.php(cake 1.3,也适用于2.x)之后,我发现,通过指定“连接”的确切方式,cake可以有效地覆盖连接的顺序
因此,在您的案例中:
'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`'
)
)
Cake使用in_array()来实现这一点,请注意``环绕表和字段名、左撇子的大写以及不使用数组作为条件,因为这些条件是进行比较所必需的。我也遇到过这种情况,当时我几乎被卡住了。在做了一些搜索之后,我发现有两种方法可以做到这一点