第四章 – 模型和ORM基础2
2011-03-31 11:14
393 查看
设置读写适配器
在上面的例子中,我们已经可以从数据库中取数据了,但是我们却没有为资源模型设置读写适配器,怎么回事呢?原因很简单,那就是因为Magento会为没有适配器的资源模型启用默认适配器。我们也可以显式的配置默认的适配器< global> <!-- ... --> < resources> < helloworld_write> < connection> < use> default_write</ use> </ connection> </ helloworld_write> < helloworld_read> < connection> < use> default_read</ use> </ connection> </ helloworld_read> </ resources> </ global>
在标签下面有两个部分,一个读,一个写。标签名字中的“hellworld”是我们定义的
组名【注:在资源模型的 “_init”函数中传入的数据表的URI
“helloworld/blogpost”的前半部分就是适配器名字的前半部分】。从这里我们也可以看出来一个资源组对应一对适配器。清空
Magento缓存,刷新浏览器,你应该看到和刚才相同的页面。【注:如果你去全局配置中找“core_read”你会发现
“default_read”,然后是“default_setup”
< default_setup> < connection> < model> mysql4</ model> < initstatements> SET NAMES utf8</ initstatements> < type> pdo_mysql</ type> < host> localhost</ host> < username> root</ username> < password> admin</ password> < dbname> zend- magento</ dbname> < active> 1 </ active> </ connection> </ default_setup>
这才是最终和数据库连接的详细信息。如果你再往下深究,你会发现全局配置有这么一段
< resource> < connection> < types> < pdo_mysql> < class> Mage_Core_Model_Resource_Type_Db_Pdo_Mysql</ class> </ pdo_mysql> </ types> </ connection> </ resource>
所以,“Mage_Core_Model_Resource_Type_Db_Pdo_Mysql”才是最终连接数据库的类。如果我们更换数据库的话,我们要重写一个相似的类来连接别的数据库。
】
基本模型操作
所有的模型最终都继承自类“Varien_Object”。这个类属于Magento的系统类库,不属于Magento的核心模块。你可以在以下位置找到这个类lib/ Varien/ Object. php
Magento模型的数据保存在“_data”属性中,这个属性是“protected”修饰的。父类“Varian_Object”定义了一些函数用来
取出这些数据。我们上面的例子用了“getData”,这个方法返回一个数组,数组的元素是“key/value”对。【注:其实就是数据表中一行的数
据,“key”就是列名,“value”就是值】我们可以传入一个参数获取某个具体的“key”的值。
$model -> getData ( ) ; $model -> getData ( 'title' ) ;
还有一个方法是“getOrigData”,这个方法会返回模型第一次被赋予的值。【注:因为模型在初始化以后,值可以被修改,这个方法就是拿到那个最原始的值】
$model -> getOrigData ( ) ; $model -> getOrigData ( 'title' ) ;
“Varien_Object”也实现了一些PHP的特殊函数,比如神奇的“__call”。你可以对任何一个属性调用“get, set, unset, has”方法
$model -> getBlogpostId ( ) ; $model -> setBlogpostId ( 25 ) ; $model -> unsetBlogpostId ( ) ; if ( $model -> hasBlogpostId ( ) ) { ... }
这里的方法名中的属性名字符合“camelcase”命名规则
【注:
简单的说就是Java的命名规则,每个单词的第一个字母大写,第一个字母可以大写也可以小写】。为了有效的利用这些方便的方法,我们在定义数据表列名的时
候要用小写,并用下划线作为分隔符,比如“blogpost_id”。在最近的Magento版本中,这个规则已经被弱化,为了实现PHP的
“ArrayAccess”接口
$id = $model -> [ 'blogpost_id' ] ; $model -> [ 'blogpost_id' ] = 25 ; //etc...
也就是说,你会在Magento中同时看到这两种技巧的使用。
Magento中的CRUD操作
Magento模型通过“load, save, delete”三个方法来支持基本的Create,Read,Update和Delete操作。我们在上面已经使用过“load”方法了。这个方法的参数就是要装在的数据记录的“id”。$blogpost -> load ( 1 ) ;
“save”方法可以用来创建新数据或者修改已有数据。我们在BlogController.php中添加如下方法
public function createNewPostAction( ) { $blogpost = Mage:: getModel ( 'helloworld/blogpost' ) ; $blogpost -> setTitle ( 'Code Post!' ) ; $blogpost -> setPost ( 'This post was created from code!' ) ; $blogpost -> save ( ) ; echo 'post created' ; }
访问以下URL
http: //127.0.0.1/Magento/helloworld/blog/createNewPost
现在你数据表中应该有两条数据了。下面来修改一条数据
public
function
editFirstPostAction(
)
{
$blogpost
=
Mage::
getModel
(
'helloworld/blogpost'
)
;
$blogpost -> load ( 1 ) ;$blogpost
->
setTitle
(
"The First post!"
)
;
$blogpost
->
save
(
)
;
echo
'post edited'
;
}
最后,我们来删除一条数据
public
function
deleteFirstPostAction(
)
{
$blogpost
=
Mage::
getModel
(
'helloworld/blogpost'
)
;
$blogpost -> load ( 1 ) ;$blogpost
->
delete
(
)
;
echo
'post removed'
;
}
模型集合
上面的例子我们只是演示了对单个数据操作,现在我们来看看如何同时操作多条记录。我们上面已经讲过,每个Magento的模型都有一个独特的模型集
合。这些模型集合实现了PHP的“IteratorAggregate”和“Countable”接口,也就是他们可以作为“count”函数的参数,并
且可以在“for each”语句中使用。
现在让我们来看看如何使用模型集合,在Blog控制器中添加如下方法
public function showAllBlogPostsAction( ) { $posts = Mage:: getModel ( 'helloworld/blogpost' ) -> getCollection ( ) ; foreach ( $posts as $blog_post ) { echo '<h3>' . $blog_post -> getTitle ( ) . '</h3>' ; echo nl2br ( $blog_post -> getPost ( ) ) ; } }
访问如下URL
http: //127.0.0.1/Magento/helloworld/blog/showAllBlogPosts
你应该看到以下异常
include ( App/Helloworld/Model/Resource/Mysql4/Blogpost/Collection. php) [ function . include ] : failed to open stream: No such file or directory
我想你不会被这个异常吓到,已经熟门熟路了。我们需要添加一个PHP类,定义Blogpost的模型集合。每个模型都有一个“protected”属性
“_resourceCollectionName”【注:从父类“Mage_Core_Model_Abstract”继承来的】。这个属性的值是这个
模型对应的模型集合的URI。
protected '_resourceCollectionName' => string 'helloworld/blogpost_collection'
在默认情况下,这个值是模型的URI加上“_collection”。Magento把模型集合也看做是一种资源(Resrouce),所以运用资源模型的命名规则,模型集合的全名是
App_Helloworld_Model_Resource_Mysql4_Blogpost_Collection
然后我们要创建如下文件
File : app/ code/ local/ App/ Helloworld/ Model/ Resource/ Mysql4/ Blogpost/ Collection. php class App_Helloworld_Model_Resource_Mysql4_Blogpost_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract { protected function _construct( ) { $this -> _init( 'helloworld/blogpost' ) ; } }
这里的参数是模型的UR,用来I来初始化模型集合。刷新页面,你应该看到数据库中的Blog都显示出来了。
总结
首先我要恭喜你,到这里你已经创建并配置了你的第一个Magento模型。在后面的章节中我们将讲解Magento的另外一种模型Entity Attribute Value Model。在这章开始的时候,我撒了一个小谎。其实在Magento中,并不是所有的模型都继承自“Mage_Core_Model_Abstract”。在
Magento最初的版本中,这个抽象类并不存在。所以有很多模型是直接继承自“Varien_Object”。不过这些并不影响我们创建Magento
模型,了解一下就可以了,方便阅读Magento的代码。
为了您的安全,请只打开来源可靠的网址
打开网站
取消
来自: http://hi.baidu.com/190420456/blog/item/9e219d3eec277acd7c1e7109.html
相关文章推荐
- 深入理解Magento – 第四章 – 模型和ORM基础.doc
- 深入理解Magento - 第四章 – 模型和ORM基础
- 第四章 – 模型和ORM基础
- 第四章 深入理解Magento – 模型和ORM基础
- magento 开发 -- 深入理解Magento第四章 – 模型和ORM基础
- 第四章 – 模型和ORM基础1
- magento 开发 -- 深入理解Magento第四章 – 模型和ORM基础
- 模型和ORM基础(4)
- 4.Magento的模型和ORM基础
- Magento模块开发手册(五)Magento模型和ORM基础
- Magento模型与ORM基础
- Django 模型系统(model)&ORM--基础
- Magento开发文档(五):Magento模型与ORM基础
- Laravel基础-Eloquent ORM 模型
- C#基础系列:实现自己的ORM(ORM的基础概念)
- 系统设计之 网络模型(一)基础篇
- 网络营销教程SEO 第四章 搜索引擎优化基础(第四节)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.8 Java平台与内存管理(4.8.1-4.8.3)
- Java多线程和内存模型(一):进程和线程基础
- 使用UML的基础平台的设计之二(概念模型)