Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Cakephp模型协会_Mysql_Cakephp - Fatal编程技术网

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有许多项,并且属于节
  • 节有许多目录项
  • 我试图获得某个部分的项目计数,按catalogitem分组- 相当于:

    选择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'];
    }