Проблема с методом поиска CakePHP 2 с помощью JOIN

#php #mysql #cakephp #cakephp-2.0

#php #mysql #cakephp #cakephp-2.0

Вопрос:

Я столкнулся с проблемой с методом поиска CakePHP с помощью JOIN и bindModel.

У меня есть 2 таблицы: Клиент и Заказ. Таблица заказов содержит все записи заказов для Клиента.

Теперь в одном запросе мне нужно Customer record Total указать причитающуюся или общую сумму заказа.

Когда я пытаюсь использовать этот запрос, он возвращает только одну запись.

 $this->Customer->bindModel(['hasOne'=>['Order'=>['fields'=>['SUM(Order.due_amount) as due']]]],false);

$data = $this->Customer->find('all',[ 'conditions' => [ 'Customer.type' => 2,'Customer.status'=>1] ]);
 

2- й, когда я пытаюсь использовать JOIN, все еще не получаю правильного результата

 $data = $this->Customer->find('all',[
'conditions' => [ 'Customer.type' => 2,'Customer.status'=>1],
'joins' =>[[ 'table' => 'orders', 'alias' => 'Order',
'type' => 'RIGHT', /*LEFT/INNER*/
'fields'=>['SUM(Order.due_amount) as due'],
'conditions' => [ 'Order.customer_id = Customer.id']]]]);
 

Используя оба метода, я не получаю правильного результата

Мне нужен такой результат, как этот

 Array( 
            [0] => Array ( [Customer] => Array ( /*all Customer table fields */ ) [Order] => Array ( [due] => 125.25))
            [1] => Array ( [Customer] => Array ( /*all Customer table fields */ ) [Order] => Array ( [due] => 10.00))
            [2] => Array ( [Customer] => Array ( /*all Customer table fields */ ) [Order] => Array ( [due] => 500.10))
.... so on 
            )
 

Ответ №1:

Вы можете использовать следующий запрос

 $joins = array(
        array('table' => 'orders',
            'alias' => 'Order',
            'type' => 'INNER',
            'conditions' => array(
                'Order.customer_id = Customer.id',
            )
        )
    );
    $conditions = [];
    $conditions[] = ['Customer.type' => 2];
    $conditions[] = ['Customer.status'=>1];
    $this->Customer->virtualFields['total_due'] = "sum(Order.due_amount)";
    $data_array = $this->Customer->find('all', ['conditions' => $conditions, 'group' => 'Customer.id', 'joins' => $joins, 'fields' => ['Customer.*', 'Customer.total_due']]);