Magento中如何在模块中使用多张数据表并配置多个model?

411 查看

功能介绍:

引用magento开发人员的一句话:

Magento has basic one resource to one table resource。

也即是一个资源对应一张数据表。
当有时候,需要在一个模块中使用多张数据表,配置多个model,那么又该如何配置model呢?

1.创建数据表:

//创建第一张表
CREATE TABLE `custom` (
`custom_id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR( 25 ) NOT NULL
PRIMARY KEY (`custom_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


//创建第二张表
CREATE TABLE `customdata` (
`customdata_id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR( 25 ) NOT NULL
PRIMARY KEY (`customdata_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.编写配置文件

<?xml version="1.0"?>
<config>
    <modules>
        <Test_Custom>
            <active>true</active>
            <codePool>local</codePool>
        </Test_Custom>
    </modules>
</config>

3.配置模块中配置文件etc/config.xml

//找到如下代码
......
<global>
    <models>
        <custom>
            <class>Test_Custom_Model</class>
            <resourceModel>custom_mysql4</resourceModel>
        </custom>
    
        <custom_mysql4>
            <class>Test_Custom_Model_Mysql4</class>
            <entities>
                //第一张表
                <custom><!--这个节点要求对应Model/Mysql4/Custom.php和Model/Mysql4/Custom/Custom.php中的_init('模块名/custom')这个参数,一般要求与表名相同-->
                    <table>custom</table>
                </custom>
                
                //第二张表
                <customdata><!--这个节点跟上面的功能一样-->
                    <table>customdata</table>
                </customdata>
            </entities>
        </custom_mysql4>
    </models>
    <resources>
        <custom_setup><!--这个节点对应sql/custom_setup文件夹的名称保持一致-->
            <setup>
                <module>Silk_Custom</module>
            </setup>
            <connection>
                <use>core_setup</use>
            </connection>
        </custom_setup>
        <custom_write>
            <connection>
                <use>core_write</use>
            </connection>
        </custom_write>
        <custom_read>
            <connection>
                <use>core_read</use>
            </connection>
        </custom_read>
    </resources>
</global>
......

4.创建模型Custom.php和Customdata.php

//app/code/local/Mypackage/Mymodule/Model/Custom.php
<?php
class Mypackage_Mymodule_Model_Test extends Mage_Core_Model_Abstract
{   
    public function _construct()
    {
        parent::_construct();
        $this->_init('mymodule/Custom');
    }
}
?>

//app/code/local/Mypackage/Mymodule/Model/Customdata.php
class Mypackage_Mymodule_Model_Test extends Mage_Core_Model_Abstract
{   
    public function _construct()
    {
        parent::_construct();
        $this->_init('mymodule/Customdata');
    }
}
?>

5.创建资源模型

//app/code/local/Mypackage/Mmodule/Model/Mysql4/Custom.php
<?php
class Mypackage_Mymodule_Model_Mysql4_Custom extends Mage_Core_Model_Mysql4_Abstract
{
    public function _construct()
    {    
        $this->_init('mymodule/custom', 'custom_id');//custom_id为表custom的主键
    }
}
?>
 

//app/code/local/Mypackage/Mmodule/Model/Mysql4/Customdata.php
<?php
class Mypackage_Mymodule_Model_Mysql4_Customdata extends Mage_Core_Model_Mysql4_Abstract
{
    public function _construct()
    {    
        $this->_init('mymodule/customdata', 'customdata_id');//customdata_id为表customdata的主键
    }
}
?>

6.创建一个集合类

//local/Mypackage/Mymodule/Model/Mysql4/Custom/Collection.php
<?php
class Mypackage_Mymodule_Model_Mysql4_Custom_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init('mymodule/custom');
    }
}
?>
 
//local/Mypackage/Mymodule/Model/Mysql4/Customdata/Collection.php
<?php 
class Mypackage_Mymodule_Model_Mysql4_Customdata_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init('mymodule/customdata');
    }
}
?>

7.现在model就配置好了

model配置好后,来做下测试,我们在block中取得数据,然后从模板文件中调取,

<?php
class Mypackage_Mymodule_Block_Custom extends Mage_Core_Block_Template
{
    /*
     * 循环遍历出option
     */
    public function getcustom($field)
    {
        $customdata=Mage::getModel('custom/customdata')->getCollection()->addfieldtofilter('field',$field);//addfieldtofilter()为过滤条件
        $res=$customdata->getData();
        //print_r($customdata->getSelectSql(true));//打印出sql语句
        foreach ($res as $v)
        {
            $val=$v['val'];
            //echo $val;
            echo "<option value='$val'>$val</option>";
        }
    }
}

在模板文件中输出:

<select name="hook_load">
    <option value="">--Select--</option>
    <?php echo $this->getcustom('hook_load');?>//调用block中的返回的数据
</select>

<select name="mast">
    <option value="">--Select--</option>
    <?php echo $this->getcustom('mast');?>//调用block中的返回的数据
</select>

数据库内容所示:

输出如图所示: