magento中Model创建以及该Model对于数据库的增删改查
本文是按照magento英文文档照做与翻译的。
Model层的实现是mvc框架的一个巨大的部分。它代表了你的应用的数据,或者说大多数应用没有数据是无用的。Magento的Model扮演着一个重要的角色,就像他们有代表性地包含了业务逻辑,经常与controller或者helper方法有关在其他的php mvc框架中。
传统的php mvc models
如果MVC的定义有一点模糊的话,Model的定义也模糊。PHP开发者们优先广泛采用MVC模式,数据接入通常是原始的SQL语句或者是一个SQL抽象层。开发者们要写查询并且不用太多思考有关他们建造的模型对象。
如今,原生的SQL大多数是令人发愁的,但是许多PHP框架仍然是SQL为中心的,Models将是对象,这些对象提供一些抽象层,但是在前端场景开发者背后仍旧是写SQL并且称SQL像抽象方法去去读写他们的数据。
其他的框架避免SQL而且采用对象关系映射(ORM)的方法。在这里,一个开发者是严格处理对象,属性是设置的,当一个保存的方法被用于一个对象,数据就自动被写入数据库。一些ORM将尝试从数据库中预言对象属性,其他人要求用户去具体说明他们用一些方法(通常是一个抽象的数据语言YAML)。一个最著名的并且受欢迎的方法的实现是ActiveRecord。
这个ORM的定义应该能够为了现在,但是像每一个电脑科学在这些天,ORM的严格定义已经模糊了好些年,它超越了这个文章的范围去解决辩论,但是能够满足我们归纳它。
Magento Models
毫无疑问,magento采用了ORM方法,当zend framework SQL抽象是可以获得的,大多数的数据层都要经过建立在Magento Models中,并且你建立的Models,还因为magento高度灵活,高度抽象,这就是一个Model的概念。
剖析Magento的Model
大多数magento Models能够被分类在两个方法中的一个。那是一个基本的,类似ActiveRecord,一个对象一个标的Model,那还是一个Entity Attribute Value(EAV)实体属性值。每一个模型还会得到一个Model集合。集合是PHP对象们被用来去聚集许多个别的Magento Model实例。Magento团队已经实现了PHP标准库迭代器接口并且允许每一个Model类型可以去有他自己的集合类型。如果你对PHP的标准库不熟悉,可以理解为Model 集合成有很多方法的数组。
Magento Models没有包含任何代码去连接数据库。想反,每一个Model 用一个modelResource 类,它被用来去跟数据库服务连接(经由一个可读的,一个可写的适配器对象)。通过去耦,逻辑Model与和数据库连接的代码,理论上可以去写一个新的资源类为了不同的数据库模式与平台当保持你的模型不被触碰的时候。
Enable developer mode
有一些事情你应该做在开发中,但是绝不要在生产环境中,那就是开启magento的开发者模式,在你的浏览器中可以展示异常,对于调试你的代码还是有用的。
开启开发者模式的方法:
- developer mode
- Edit the .htaccess in the Magento root directory file to add SetEnv MAGE_IS_DEVELOPER_MODE "true"
创建一个基本的Model
我们先创建一个基本的magento Model,PHP MVC传统强调我们模拟一个网络日志发送,步骤如下:
- 创建一个“Weblog”模块
- 创建一个数据库的表为我们的模型
- 添加模型信息到配置文件 model名字叫Blogpost
- 添加Mddel 资源信息到配置文件为Blogpost模型
- 添加一个可读的适配器到配置文件为这个Blogpost模型
- 添加一个可写的适配器到配置文件为这个Blogpost模型
- 添加一个PHP的类文件为Blogpost模型
- 添加一个PHP类文件Blogpost资源模型
举例说明
1创建一个Weblog模块
In Magentotutorial/Weblog/etc/config.xml, setup the following route
<frontend>
<routers>
<weblog>
<use>standard</use>
<args>
<module>Magentotutorial_Weblog</module>
<frontName>weblog</frontName>
</args>
</weblog>
</routers>
</frontend>
And then add the following Action Controller in
class Magentotutorial_Weblog_IndexController extends Mage_Core_Controller_Front_Action {
public function testModelAction() {
echo 'Setup!';
}
}
at Magentotutorial/Weblog/controllers/IndexController.php. Clear your Magento cache and load the following URL to ensure everything's been setup correctly.
http://example.com/weblog/index/testModel
You should see the word "Setup" on a white background.
2.创建数据库的表
Magento有一个自动创建于改变数据库模型的系统,但是开始我们还是手动创建这个表为我们的Model。
CREATE TABLE `blog_posts` (
`blogpost_id` int(11) NOT NULL auto_increment,
`title` text,
`post` text,
`date` datetime default NULL,
`timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`blogpost_id`)
)
INSERT INTO `blog_posts` VALUES (1,'My New Title','This is a blog post','2010-07-01 00:00:00','2010-07-02 23:12:30');
新建表并插入一行数据
3. The Global Config and Creating The Model (Global的配置与创建模型)
有三个事情我们需要设置一个模型在我们配置文件
- 授权Models在我们的模块中
- 授权Model资源在我们的模块中
- 添加一个实体表配置在我们的模型资源中
当你实现了一个model在magento中,获取model的方法是
$model = Mage::getModel('weblog/blogpost');
GetModel的参数值第一部分就是得到Model组名。应该是module名字的小写或者是用包名+module名 (小写)。第二部分是Model名字的小写。
先加下面的配置信息在app\code\local\Magentotutorial\Weblog\etc\config.xml:
<global>
<!-- ... -->
<models>
<weblog>
<class>Magentotutorial_Weblog_Model</class>
<!--
need to create our own resource, can't just
use core_resource
-->
<resourceModel>weblog_resource</resourceModel>
</weblog>
</models>
<!-- ... -->
</global>
<weblog /> tag is your Group Name,which should match your module name
<weblog />=====<magentotutorial_blog />
<class /> is the BASE name all Models in the weblog group will have, also calles Class Prefix.前缀
The <resourceModel /> tag indicates which Resource Model that weblog group Models should use. There's more on this below, but for now be content to know it's your Group Name, followed by a the literal string "resource".
<resourceModel />参数就是Group Name_ resource
4. Create the following class at the following location
File: app/code/local/Magentotutorial/Weblog/Model/Blogpost.php
class Magentotutorial_Weblog_Model_Blogpost extends Mage_Core_Model_Abstract
{
protected function _construct()
{
$this->_init('weblog/blogpost');
}
}
5.The Global Config and Resources
<global>
<!-- ... -->
<models>
<!-- ... -->
<weblog_resource>
<class>Magentotutorial_Weblog_Model_Resource</class>
</weblog_resource>
</models>
</global>
public function testModelAction() {
$params = $this->getRequest()->getParams();
$blogpost = Mage::getModel('weblog/blogpost');
echo("Loading the blogpost with an ID of ".$params['id']);
$blogpost->load($params['id']);
$data = $blogpost->getData();
var_dump($data);
}
http://example.com/weblog/index/testModel/id/1
6.资源类文件
File: app/code/local/Magentotutorial/Weblog/Model/Resource/Blogpost.php
class Magentotutorial_Weblog_Model_Resource_Blogpost extends Mage_Core_Model_Resource_Db_Abstract{
protected function _construct()
{
$this->_init('weblog/blogpost', 'blogpost_id');
}
}
7.实体配置
<models>
<!-- ... --->
<weblog_resource>
<class>Magentotutorial_Weblog_Model_Resource</class>
<entities>
<blogpost>
<table>blog_posts</table>
</blogpost>
</entities>
</weblog_resource>
</models>
结果:http://example.com/weblog/index/testModel/id/1
Loading the blogpost with an ID of 1 array
'blogpost_id' => string '1' (length=1)
'title' => string 'My New Title' (length=12)
'post' => string 'This is a blog post' (length=19)
'date' => string '2009-07-01 00:00:00' (length=19)
'timestamp' => string '2009-07-02 16:12:30' (length=19) 8.Basic Model Operations
$model->getData();
$model->getData('title');
$model->getOrigData();
$model->getOrigData('title');
$model->getBlogpostId();
$model->setBlogpostId(25);
$model->unsetBlogpostId();
if($model->hasBlogpostId()){...} 9.magento中的增删改查
$blogpost->load(1);(这个1就是数据库中主键那个1)
9.1插入
public function createNewPostAction() {
$blogpost = Mage::getModel('weblog/blogpost');
$blogpost->setTitle('Code Post!');
$blogpost->setPost('This post was created from code!');
$blogpost->save();
echo 'post with ID ' . $blogpost->getId() . ' created';
}
9.2修改
public function editFirstPostAction() {
$blogpost = Mage::getModel('weblog/blogpost');
$blogpost->load(1);
$blogpost->setTitle("The First post!");
$blogpost->save();
echo 'post edited';
}
9.3删除
public function deleteFirstPostAction() {
$blogpost = Mage::getModel('weblog/blogpost');
$blogpost->load(1);
$blogpost->delete();
echo 'post removed';
}
9.4查询(此时有多条数据,要有集合文件)
新建集合文件
app/code/local/Magentotutorial/Weblog/Model/Resource/Blogpost/Collection.php
class Magentotutorial_Weblog_Model_Resource_Blogpost_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract {
protected function _construct()
{
$this->_init('weblog/blogpost');
}
}
public function showAllBlogPostsAction() {
$posts = Mage::getModel('weblog/blogpost')->getCollection();
foreach($posts as $blogpost){
echo '<h3>'.$blogpost->getTitle().'</h3>';
echo nl2br($blogpost->getPost());
}
}
查询结果:

数据库中的表:

magento中Model创建以及该Model对于数据库的增删改查的更多相关文章
- django之创建第8-1个项目-数据库之增删改查/数据库数据显示在html页面
1.为test.DB数据库预先创建下面数据 1 张三 16 2015-01-02 12 李四 17 2015-01-04 13 王五 14 ...
- MFC中对基于ODBC对数据ACCESS数据库的增删改查。
在MFC中可以使用很多方法对数据库进行操作. 什么ODBC 什么ADO之类的,这里要介绍使用的ODBC这种方法,通过本文的阅读可以达初步掌握在MFC里面通过ODBC访问ACCESS数据库. 涉及到的 ...
- Android中Sqlite数据库进行增删改查
今天这篇文章写Sqlite数据库,通过一个小案例来完整讲一下数据库常见的CRUD操作. 先对知识点总结: SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHel ...
- [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?
[译]聊聊C#中的泛型的使用(新手勿入) 写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...
- java程序设计课期中考试——数据库的增删改查和简单的js界面
首先是设计思路,对于数据库的增删改查,我们借助Ecilipse来进行前端和后端的编写.Ecilipse是可以进行java web项目的操作的. 前端,我们选择用使用jsp,所谓的jsp就是可以嵌入其他 ...
- PHP程序中使用PDO对象实现对数据库的增删改查操作的示例代码
PHP程序中使用PDO对象实现对数据库的增删改查操作(PHP+smarty) dbconn.php <?php //------------------------使用PDO方式连接数据库文件- ...
- Django中ORM对数据库的增删改查操作
前言 什么是ORM? ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...
- mogoose 创建数据库并增删改查
下载 npm i mongoose -s 连接数据库 const mongoose = require("mongoose"); mongoose.connect(dbURL); ...
- SpringBoot+MyBatis中自动根据@Table注解和@Column注解生成增删改查逻辑
习惯使用jpa操作对象的方式,现在用mybatis有点不习惯. 其实是懒得写SQL,增删改查那么简单的事情你帮我做了呗,mybatis:NO. 没办法,自己搞喽! 这里主要是实现了通过代码自动生成my ...
随机推荐
- 洛谷P1636学画画
传送 这个题我们需要一个大胆的想法(虽然AC后看了题解知道这是个定理) (求证明qwq) 如果一个图有2或0个奇点,它就一定可以一笔画出,如果不是2或0个奇点,那答案就是奇点数/2 (私认为因为两个奇 ...
- google的protobuf简单介绍
google的protobuf是一种轻便高效的结构化数据存储格式,在通信协议和数据存储等领域中使用比较多.protobuf对于结构中的每个成员,会提供set系列函数和get系列函数. 但是,对于使用来 ...
- 2017-2018-2 20165312 实验四《Android程序设计》实验报告
2017-2018-2 20165312 实验四<Android程序设计>实验报告 一.安装Android Studio并进行Hello world测试和调试程序 安装Android St ...
- minicom 抓取log
使用minicom也有很长时间了,只用minicom抓过uart log,但是从来没有去保存过这个log,也不知道有这个功能.后来在超级终端中发现有这个功能(传送->捕获文字),想想minico ...
- MYSQL SQL语句技巧初探(一)
MYSQL SQL语句技巧初探(一) 本文是我最近了解到的sql某些方法()组合实现一些功能的总结以后还会更新: rand与rand(n)实现提取随机行及order by原理的探讨. Bit_and, ...
- django之COOKIE 与 SESSION
COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...
- android 开发 我的高德地图代码例子
下载高德地图依赖库和相关注册方式,请查看高德开发者网站:http://lbs.amap.com/api/android-sdk/summary 点击打开链接 高德地图坐标拾取器:http://lbs ...
- mysql 5.7 配置
MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装. zip格式是自己解压,解压缩之后其实MySQL,配置完就可以使用了. 1,配置环境变量很简单: ...
- python大法好——模块(内置模块未完)
模块 模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模块. Python模块有什么作用? 1.模块内有许多函数方法,利用这些方法可以更简单的完成许多工作.2.模块 ...
- git保存用户名和密码
git保存用户名和密码 简介:tortoiseGit(乌龟git)图形化了git,我们用起来很方便,但是我们拉取私有项目的时候,每次都要输入用户名和密码很麻烦,这里向大家介绍怎么避免多少输入 试验环境 ...