CakePHP中连接顺序的处理

CakePHP中连接顺序的处理,cakephp,join,model,Cakephp,Join,Model,我对CakePHP有以下问题: 在我的模型中,存款属于账户,账户属于客户 查询存款时,默认情况下,我会获取帐户信息,但不会获取客户的信息 如果我将Deposit->recursive设置为2,我将获得客户信息(以及更多),但是CakePHP本质上会在每次存款中抛出一个SELECT,这在这种情况下非常糟糕 所以,我这样做了: 'joins' => array( array('table'=>'customers', 'alias'=>'Customer', 'type'=

我对CakePHP有以下问题:

在我的模型中,存款属于账户,账户属于客户

查询存款时,默认情况下,我会获取帐户信息,但不会获取客户的信息

如果我将Deposit->recursive设置为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
这当然行不通

是否仍要指定“我的自定义联接”应位于“常规模型联接”之后?
或者我必须手动解除存款与帐户的绑定,并手动指定两个联接吗

谢谢

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()来实现这一点,请注意``环绕表和字段名、左撇子的大写以及不使用数组作为条件,因为这些条件是进行比较所必需的。

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

  • 编辑core DboSource.php文件以更改连接顺序。()

  • 或者我们需要在$joins数组中显式指定关联。然后在查询中使用递归-1

  • 我希望现在有可能的选择。如果你有任何其他有趣的方式,请张贴在这里