группа cakephp на связанной модели/таблице

Краткая предыстория: у меня есть заказы, содержащие продукты под названием «Комплексы». Комплексы имеют разные размеры (высоту и ширину), если есть несколько комплексов с одинаковыми мерами в порядке их группировки и добавления счетчика для создания рабочих мест для рабочих.

Мои модели:

class Order extends AppModel {
public $hasMany = 'Komplex';
public $belongsTo = array(
    'Customer' => array(
        'counterCache' => true
    )
);
}


class Komplex extends AppModel {
public $belongsTo = array(
    'Order' => array(
        'counterCache' => true
    )
);
...<validation and calculations>
}

В моем OrdersController я начинаю с

    public function orderproductionjob($id = NULL) {
    if (!$id) {
        throw new NotFoundException(__('Invalid ID'));
    }
    $order = $this->Order->find('all', array(
        'conditions' => array('Order.id =' => $id),
        'group' => array('Komplex.height')
    ));
    die(debug($order));

Это дает мне ошибку базы данных:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Komplex.height' in 'group statement'

Тот же «найти» без «группы» дает мне правильный результат (кроме группировки ;-)

Так что совершенно очевидно, что я делаю что-то не так с группой. Я мог бы найти примеры для ассоциаций и примеры для группировки в Интернете и в поваренной книге, но эта комбинация не упоминалась или, вероятно, я ее не нашел. Поскольку это мой первый проект с cakephp, я надеюсь, что кто-нибудь с большим опытом сможет мне помочь.

Что я пытаюсь заархивировать в SQL:

SELECT orders.id, orders.name, komplexes.width, komplexes.height, count(komplexes.id) as Count
FROM orders, komplexes
WHERE orders.id = 1 AND komplexes.order_id = orders.id
group by komplexes.width, komplexes.height;

person Axx    schedule 29.11.2014    source источник


Ответы (1)


Попробуйте изменить свой код на Group в модели Komplex.

$komplex = $this->Order->Komplex->find('all', array(
    'fields' => array('Komplex.height', 'Komplex.width', 'Count(*) as `Count`')
    'conditions' => array('Komplex.order_id =' => $id),
    'group' => array('Komplex.height', 'Komplex.width')
));

к вашему сведению

  1. Ваш оператор SQL работает, потому что у вас гарантированно будет только 1 строка заказов. Он может и, скорее всего, вернет неправильные результаты, если вы попытаетесь присоединиться к более чем 1 строке заказов.
  2. Вы должны быть осторожны, используя зарезервированные слова SQL в своем заявлении. В вашем случае Count в качестве имени столбца с псевдонимом. Вы можете изменить это. Обратите внимание, что в моем примере кода COUNT окружен обратными кавычками.
person AgRizzo    schedule 29.11.2014
comment
Спасибо, с '$order = $this-›Order-›findById($id);' + '$order['Komplex'] = $this-›Order-›Komplex-›find('all', array(...') Я получаю желаемый результат. - person Axx; 29.11.2014
comment
+дополнительные кредиты за то, что вы нашли время и решили проблему Count()! - person Axx; 29.11.2014