如何在Magento Collection中将字段选择查询添加为字段

时间:2014-06-26 12:19:31

标签: magento

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

班级表:

id     clas_name

学生表:

id   class_id    student_name
student表中的

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

如何做任何建议?

2 个答案:

答案 0 :(得分:8)

看起来您必须在查询中添加列。在已经有集合的场景中,让我们假设你的$ 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)'
        )));

上面的表达式将在您编写时生成查询。

答案 1 :(得分:0)

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

 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")->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/