关联模型/表上的cakephp组

关联模型/表上的cakephp组,cakephp,cakephp-2.5,Cakephp,Cakephp 2.5,简短背景:我的订单中包含名为“Komplexes”的产品。Komplexes有不同的尺寸(高度和宽度),如果有多个Komplexes具有相同的度量值,则必须按顺序对其进行分组,并且必须添加计数器以为工人创造就业机会 我的模型: class Order extends AppModel { public $hasMany = 'Komplex'; public $belongsTo = array( 'Customer' => array( 'counterCache

简短背景:我的订单中包含名为“Komplexes”的产品。Komplexes有不同的尺寸(高度和宽度),如果有多个Komplexes具有相同的度量值,则必须按顺序对其进行分组,并且必须添加计数器以为工人创造就业机会

我的模型:

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>
}
这给了我一个数据库错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Komplex.height' in 'group statement'
没有“group”的相同“find”给出了正确的结果(分组除外;-)

所以很明显,我在这群人身上做错了什么。我可以在网上和烹饪书中找到关于组合和分组的例子,但是没有提到这种组合,或者我可能没有找到。由于这是我使用cakephp的第一个项目,我希望有更多经验的sombody能够帮助我

我试图在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;

尝试将代码更改为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')
));
供参考

  • SQL语句之所以有效,是因为保证您只有一行订单。如果您尝试加入多个orders行,它可能返回错误的结果,而且很可能返回错误的结果
  • 在语句中使用SQL保留字时需要小心。在您的情况下,
    计算为别名列名。你可能想改变这一点。请注意,我的代码示例的计数被反勾号包围

  • 谢谢您,使用“$order=$this->order->findById($id);”+”$订单['Komplex']=$this->order->Komplex->find('all',array(…'我得到了所需的输出。+额外的积分,感谢您花时间解决计数()问题!
    $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')
    ));