【问题标题】:How to add field select query as field in Magento Collection如何在 Magento Collection 中添加字段选择查询作为字段
【发布时间】:2018-05-09 05:57:43
【问题描述】:

我有一个名为 mymodule/class 的 Magento 集合。我的 Magento 数据库中有两个表 classstudent

类表:

id     clas_name

学生桌:

id   class_id    student_name

学生表中的class_id是班级表中id的外键。

我想创建mymodule/class 集合,以便 sql 如下所示:

select a.*, (select count(id) FROM studetn 
                WHERE class_id = a.id) as student_count 
FROM class a

或者,我想从上面的sql中生成mymodule/class

有什么建议吗?

【问题讨论】:

    标签: magento


    【解决方案1】:

    看起来您必须在查询中添加列。在您已经有收藏的情况下,让我们假设您的 $collection 变量如下:

    $collection = Mage::getModel("mymodule/class")->getCollection()
    

    所以,你必须修改如下查询:

    $collection->getSelect()->columns(
            array(
                'student_count' => new Zend_Db_Expr('(SELECT count(id) FROM student WHERE class_id=main_table.id)'
            )));
    

    上面的表达式会在你写的时候生成查询。

    【讨论】:

    • 正是我想要的。
    【解决方案2】:

    首先创建模块控制文件模块名称为

     Amit_Custommodule.xml at app/etc/modules/ 
    

    代码

    <?xml version="1.0"?>
    <config>
        <modules>
            <Amit_Custommodule>
                <codePool>community</codePool>
                <active>true</active>
            </Amit_Custommodule>
        </modules>
    </config>
    

    config.xml的路径是app/code/community/Amit/Custommodule/etc/

    我们定义代码池是社区,那么它的路径是 app/code/community

    这里Amit文件夹是模块的命名空间,Custommodule是模块名

    <?xml version="1.0" ?>
    <config>
        <modules>
            <Amit_Custommodule>
                <version>1.0.0</version>
            </Amit_Custommodule>
        </modules>
        <global>
            <models>
                <custommodule>
                    <class>Amit_Custommodule_Model</class>
                    <resourceModel>custommodule_resource</resourceModel>
                </custommodule>
                <custommodule_resource>
                    <class>Amit_Custommodule_Model_Resource</class>
                    <entities>
                        <custommodule>
                            <table>studetn</table>
                        </custommodule>
                    </entities>
                </custommodule_resource>
            </models>
    
        </global>
    
       </config>
    

    模型文件Custommodule.php 路径为app/code/community/Amit/Custommodule/Model 和代码

    <?php
    class Amit_Custommodule_Model_Custommodule extends Mage_Core_Model_Abstract
    {
        public function _construct()
        {
            $this->_init('custommodule/custommodule');
        }
    
    }
    

    如果我们定义模型,那么我们需要定义模型Custommodule.php的资源类

    资源类我的模块是Custommodule.php app/code/community/Amit/Custommodule/Model/Resource/ 和代码

    <?php
    class Amit_Custommodule_Model_Resource_Custommodule extends Mage_Core_Model_Resource_Db_Abstract
    {
        /**
         * Initialize resource model
         *
         * @return void
         */
        public function _construct()
        {
            $this->_init('custommodule/custommodule', 'id');
        }
        public function getMyCount($std)
    {
        $Table = Mage::getSingleton('core/resource')->getTableName('custommodule/custommodule');
    
        $select = $this->getReadConnection()->select()
            ->from(
                array('main_table' => $Table),
                array(new Zend_Db_Expr('COUNT(main_table.id)'))
            )
            ->where('main_table.id = :id');
    
        $bind = array('id' => (int)$std->getId());
        $counts = $this->getReadConnection()->fetchOne($select, $bind);
    
        return intval($counts);
    }
    
    }
    

    这两个文件构成了最终模块Mage::getModel("custommodule/custommodule")-&gt;load($primaryKeyOfTable);

    现在我们需要对获取表中所有数据的模块的集合文件进行分类

    集合文件路径是Collection.php app/code/community/Amit/Custommodule/Model/Resource/Custommodule 也是它的代码

    <?php
    class Amit_Custommodule_Model_Resource_Custommodule_Collection
    extends Mage_Core_Model_Resource_Db_Collection_Abstract{
        protected function _constuct(){
            $this->_init('custommodule/custommodule');    
        }
    }
    

    还有

    $Collection=Mage::getModel("custommodule/custommodule")->Collection(); 
    
    foreach($Collectio as $each)
    {
    $each->getMyCount();
    }
    

    更多细节 http://www.amitbera.com/create-an-magento-extension-with-custom-database-table/

    【讨论】:

    • 感谢 Amit 的精彩解释。这是一篇非常棒的文章。但这不是我正在寻找的答案。
    • @krishna 代码是工作物品...Elisa 你的问题也很好。我给两个赞成票
    猜你喜欢
    • 2022-07-07
    • 2011-07-03
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    相关资源
    最近更新 更多