CakePHP - How do I join a table on a joined table?

拜拜、爱过 提交于 2020-01-06 07:34:11

问题


I am in the FilesController and I'm trying to get a file based on the condition that its order belongs to the current user.

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 Error

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

I'm trying to get the SQL to left join orders onto files and then left join customers onto orders, but I can't figure out how to join the customers table, although I'm sure I've done this before. I've tried everything I can think of with the conditions, and using contains.

Here's my model relationships:

Customer Model

class Customer extends AppModel {

    public $hasMany = array('Order');

}

Order Model

class Order extends AppModel {

    public $belongsTo = array('Customer');

    public $hasMany = array('File');

}

File Model

class File extends AppModel {

    public $belongsTo = array('Order');

}

回答1:


Try joining the tables using the 'joins' parameter. Sometimes 'contains' doesn't work and you need to fall back on this.

$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')
        )
    )
));



回答2:


You may want to use Containable (http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html) as it is the easiest solution. You can not use Order.Customer.id as Cake does not nest conditions like that. Manual joins would also work.




回答3:


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

Orders will be accessible as:

pr($customer['Order']);

File will be accessible as:

pr($customer['File']);



回答4:


I realised there is no need to actually join the customers table in this instance, because the orders table already has the customer_id.

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


来源:https://stackoverflow.com/questions/13707548/cakephp-how-do-i-join-a-table-on-a-joined-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!