magento中有两个模型,第一个是Model文件和第二个Model资源文件。模型用于逻辑操作,资源文件用于执行实际的数据库查询。config.xml文件如下配置的:
<global>
<models>
<subscribe>
<class>Test_Subscribe_Model</class>
<resourceModel>test_subscribe_resource</resourceModel>
</subscribe>
<test_subscribe_resource>
<class>Test_Subscribe_Model_Resource</class>
<entities>
<stock>
<table>subscribe_stock_item</table>
</stock>
</entities>
</test_subscribe_resource>
</models>
<blocks>
<subscribe>
<class>Test_Subscribe_Block</class>
</subscribe>
</blocks>
<helpers>
<subscribe>
<class>Test_Subscribe_Helper</class>
</subscribe>
</helpers>
<resources>
<test_subscribe_setup>
<setup>
<module>Test_Subscribe</module>
<class>Test_Subscribe_Model_Resource_Setup</class>
</setup>
</test_subscribe_setup>
</resources>
</global>
上面几个重要的解释:
<entities>
<stock>
<table>subscribe_stock_item</table> <!-- 数据库实体,table内是数据库的名称 -->
</stock>
</entities>
正如您将要看到的那样,在magento中我们使用不同的标识符引用所有数据库表名称,并且在标记中,我们定义了magento表标识和实际表名之间的关系。例如
"subscribe/stock"=>subscribe_stock_item
接下来我们将创建模型文件:
class Test_Subscribe_Model_Stock extends Mage_Core_Model_Abstract
{
protected function _construct()
{
$this->_init('subscribe/stock');
}
}
接下来我们需要创建资源文件,我们需要在Model文件夹下创建一个Resource文件夹。
class Test_Subscribe_Model_Resource_Stock extends Mage_Core_Model_Mysql4_Abstract
{
protected function _construct()
{
$this->_init('subscribe/stock','id');
}
}
这里重要的是要注意,这里的’subscribe/stock’'是我们在config.xml文件中创建的magento表标识符。'id’是id的名称($idFieldName).
模型的一些函数
继承Mage_Core_Model_Abstract类的magento中的所有模型都具有save(),delete()和load()函数,以及许多其他重要函数。在进入这些功能之前,还有另一个重要的事情需要学习。magento中的每个模型都可以调用任何getter和setter函数。
例如,$ model->setAbc()将起作用,$ model->getAbc()将返回该值。同样,可以完成$ model->setManish(),$ model-> setCreatedDate()。要记住的另一个功能是$ model->getData()。此函数返回一个数组,其中包含通过setter函数在模型中“设置”的所有数组。
如果你想知道如何实现这些setter和getter,它是通过php magic功能完成的。这些是在Varien_Object类中实现的。这些都是操作模型对象的_data。
save()
save()用于在表中执行INSERT操作。因此,在保存模型之前,您需要先设置模型中的所有值。在下面例子中,
第一,
$model = Mage::getModel(‘test/test’);
$model->setTitle(‘test title’);
$model->setName(‘filename’);
$model->save();
第二,
$arr=array('title'=>'test title','name'=>'filename');
$model->setData($arr);
第三,
$model->setData('title','test title');
$model->setData('name','filename');
第四,
$arr=array('title'=>'test title','name'=>'filename');
$model->addData('$arr'); //这个相当于上面第三种
正如您将注意到的,这些与我们的数据库表列相同。这会将所有这些值插入表中的相应列。之后,save()完成。
load()
load(),函数顾名思义,用于从表中读取行并设置模型中的值。
要使加载功能起作用,您需要拥有该表的主键。例如,
$id = 3;
$model = Mage::getModel(‘test/test’)->load($id);
echo $model->getTitle();
print_r($model->getData());
$model->setTitle(‘new title’);
$model->save();
更新表中的现有行,对应update()操作。
delete()
删除,函数将根据主键删除表中的行。因此,如果我们执行$ model-> delete(),它将删除模型中加载的主键的行。
$id = 3;
$model = Mage::getModel(‘test/test’)->load($id);
$model->delete();
_before和_after函数
当我们的模型类继承Mage_Core_Model_Abstract时,我们可以访问模型类中的许多有用函数。我们已经讨论过save(),load()和delete()函数。其他有用的函数有:beforeSave(), afterSave(),_ beforeFoad(),_ afterLoad(),_ beforeFellDelete(),_ afterDelete()。顾名思义,这些函数在各自的操作之前和之后调用。
_beforeSave():在保存模型之前调用。因此,如果您想在保存之前执行验证,可以在此处执行此操作。
例如,如果在保存用户模型之前假设,我们需要检查重复的电子邮件地址。
protected function _beforeSave()
{
parent::_beforeSave();
if($this->getResource()->checkDuplicate($this)){
throw new Exception('User Email Already Exists');
}
return $this;
}
同样,我们也可以使用其他功能。
本文深入探讨Magento中模型(Model)与资源文件(Resource Model)的作用与配置方式,解析config.xml文件配置,展示如何创建模型与资源文件,以及它们在数据库操作中的应用。
261

被折叠的 条评论
为什么被折叠?



