Mysql Cakephp模型协会
我有以下简单的模型:Mysql Cakephp模型协会,mysql,cakephp,Mysql,Cakephp,我有以下简单的模型: 项属于目录项 CatalogItem有许多项,并且属于节 节有许多目录项 我试图获得某个部分的项目计数,按catalogitem分组- 相当于: 选择catalogitem.id,count(*)从节左连接到节上的catalogitem.id=catalogitem.section\u id左连接到节上的项目。catalogitem\u id=catalogitem.id其中节。id=5按catalogitem.id分组 sql非常简单,但我无法将其用于蛋糕模型。有人能指出
选择catalogitem.id,count(*)从节左连接到节上的catalogitem.id=catalogitem.section\u id左连接到节上的项目。catalogitem\u id=catalogitem.id其中节。id=5按catalogitem.id分组
sql非常简单,但我无法将其用于蛋糕模型。有人能指出如何使用模型->查找来处理蛋糕模型吗?
我无法将其正确分组或在3个表上正确联接:(
编辑:
非常喜欢通过单个查询获取信息这里有一个较长的方法,“卡基什”方法:
然后只需在控制器中使用它:
$ret = $this->Item->getCountForSection(1);
debug($ret);
它是如何工作的:
- 定义一个(蛋糕1.3+仅AFAIK)来计算项目
- 获取属于您感兴趣的部分的所有Catalogitems
- 用于获取简单数组中的Catalogitems
- 在对项目进行计数和分组时,使用Catalogitems数组筛选项目
注意:您似乎没有在数据库中使用。这可能会伤害您。抱歉,在我的第一个回答中,我不知怎么错过了您的分组要求,我现在意识到这是问题的全部要点。我还没有使用这个,但我最近遇到了它,它看起来可能会实现您想要的:可链接行为 与Containable类似,但仅适用于右连接和左连接,生成更紧凑的查询并支持分组 @azv 这对你有用吗:
$section_id = 5;
$fields = array('CatalogItem.id as CatalogItemId', 'count(*) AS SectionCount');
$conditions = array('Section.id' => $section_id);
$joins = array(
array('table' => 'catalogitem',
'alias' => 'CatalogItem',
'type' => 'LEFT',
'conditions' => array('Section.id' => 'CatalogItem.section_id')
),
array('table' => 'item',
'alias' => 'Item',
'type' => 'LEFT',
'conditions' => array('Item.catalogitem_id' => 'CatalogItem.id')
));
$data = $this->Section->find('all',
array('fields' => $fields,
'conditions' => $conditions,
'joins' => $joins,
'group' => 'CatalogItem.id',
'recursive' => -1)
);
// access your data values
foreach ($data['Section'] as $i => $datarow) {
$catalogitem_id = $datarow['CatalogItemId'];
$section_count = $datarow['SectionCount'];
}
通过这种方式,您可以显式设置联接并在一个查询中完成所有操作。有关Cake中联接的更多信息,请参见此处:
希望这有帮助。祝你一切顺利,-s_r谢谢Hannibal!但是,这涉及到两个查询。是的,这是两个查询,但这是我在短时间内能做的最好的。我可能会这样做,并且只有当我注意到它会导致性能问题时才对它进行优化。你的第二个评论是什么意思?PS-我在我的代码中假设你在
部分
控制中呃,要在部分
模型中执行相同操作,请使用$this->find()
而不是$this->Section->find()
。
$section_id = 5;
$fields = array('CatalogItem.id as CatalogItemId', 'count(*) AS SectionCount');
$conditions = array('Section.id' => $section_id);
$joins = array(
array('table' => 'catalogitem',
'alias' => 'CatalogItem',
'type' => 'LEFT',
'conditions' => array('Section.id' => 'CatalogItem.section_id')
),
array('table' => 'item',
'alias' => 'Item',
'type' => 'LEFT',
'conditions' => array('Item.catalogitem_id' => 'CatalogItem.id')
));
$data = $this->Section->find('all',
array('fields' => $fields,
'conditions' => $conditions,
'joins' => $joins,
'group' => 'CatalogItem.id',
'recursive' => -1)
);
// access your data values
foreach ($data['Section'] as $i => $datarow) {
$catalogitem_id = $datarow['CatalogItemId'];
$section_count = $datarow['SectionCount'];
}