CakePHP - 如何在连接表上连接表?

时间:2012-12-04 16:36:38

标签: cakephp cakephp-2.0

我在FilesController中,我正在尝试根据其订单属于当前用户的条件获取文件。

FilesController

// Check the file exists and that it belongs to the user

$this->File->find('first', array(
    'conditions' => array(
        'File.id' => $id,
        'Order.Customer.id' => $this->Auth->user('id')
    ),
    'recursive' => 2
));

Cake SQL错误

Unknown column 'Order.Customer.id' in 'where clause'

我正在尝试让SQL将orders加入files,然后将customers加入orders,但我无法弄清楚如何加入客户表,虽然我确信我之前已经这样做了。我已经尝试了所有我能想到的条件,并使用contains

这是我的模特关系:

客户模式

class Customer extends AppModel {

    public $hasMany = array('Order');

}

订单型号

class Order extends AppModel {

    public $belongsTo = array('Customer');

    public $hasMany = array('File');

}

文件模型

class File extends AppModel {

    public $belongsTo = array('Order');

}

4 个答案:

答案 0 :(得分:0)

尝试使用'joins'参数加入表格。有时候“包含”不起作用,你需要依靠它。

$this->File->find('first', array(
    'conditions' => array(
        'File.id' => $id,
        'Order.Customer_id' => $this->Auth->user('id')
    ),
    'joins' => array(
        array(
            'table' => 'orders',
            'alias' => 'Order',
            'type' => 'LEFT',
            'conditions' => array('File.orders_id = Order.id')
        ),
        array(
            'table' => 'customers',
            'alias' => 'Customer',
            'type' => 'LEFT',
            'conditions' => array('Customer.orders_id = Order.id')
        )
    )
));

答案 1 :(得分:0)

您可能希望使用Containable(http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html),因为它是最简单的解决方案。您不能使用Order.Customer.id,因为Cake不会嵌套这样的条件。手动连接也可以。

答案 2 :(得分:0)

$this->loadModel('Customer');
$customer = $this->Customer->findById($this->Auth->user('id'), array(
        'conditions' => array(
            'File.id' => $id
        ),
        'recursive' => 2
    ));

订单可以访问:

pr($customer['Order']);

文件可以访问:

pr($customer['File']);

答案 3 :(得分:0)

我意识到在这个实例中没有必要实际加入customers表,因为orders表已经有了customer_id。

$this->File->find('first', array(
    'conditions' => array(
        'File.id' => $id,
        'Order.customer_id' => $this->Auth->user('id')
    )
));