本文是按照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传统强调我们模拟一个网络日志发送,步骤如下:

  1. 创建一个“Weblog”模块
  2. 创建一个数据库的表为我们的模型
  3. 添加模型信息到配置文件 model名字叫Blogpost
  4. 添加Mddel 资源信息到配置文件为Blogpost模型
  5. 添加一个可读的适配器到配置文件为这个Blogpost模型
  6. 添加一个可写的适配器到配置文件为这个Blogpost模型
  7. 添加一个PHP的类文件为Blogpost模型
  8. 添加一个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的配置与创建模型)

有三个事情我们需要设置一个模型在我们配置文件

  1. 授权Models在我们的模块中
  2. 授权Model资源在我们的模块中
  3. 添加一个实体表配置在我们的模型资源中

当你实现了一个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对于数据库的增删改查的更多相关文章

  1. django之创建第8-1个项目-数据库之增删改查/数据库数据显示在html页面

    1.为test.DB数据库预先创建下面数据 1    张三    16    2015-01-02    12    李四    17    2015-01-04    13    王五    14  ...

  2. MFC中对基于ODBC对数据ACCESS数据库的增删改查。

    在MFC中可以使用很多方法对数据库进行操作. 什么ODBC  什么ADO之类的,这里要介绍使用的ODBC这种方法,通过本文的阅读可以达初步掌握在MFC里面通过ODBC访问ACCESS数据库. 涉及到的 ...

  3. Android中Sqlite数据库进行增删改查

    今天这篇文章写Sqlite数据库,通过一个小案例来完整讲一下数据库常见的CRUD操作. 先对知识点总结: SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHel ...

  4. [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?

    [译]聊聊C#中的泛型的使用(新手勿入)   写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...

  5. java程序设计课期中考试——数据库的增删改查和简单的js界面

    首先是设计思路,对于数据库的增删改查,我们借助Ecilipse来进行前端和后端的编写.Ecilipse是可以进行java web项目的操作的. 前端,我们选择用使用jsp,所谓的jsp就是可以嵌入其他 ...

  6. PHP程序中使用PDO对象实现对数据库的增删改查操作的示例代码

    PHP程序中使用PDO对象实现对数据库的增删改查操作(PHP+smarty) dbconn.php <?php //------------------------使用PDO方式连接数据库文件- ...

  7. Django中ORM对数据库的增删改查操作

         前言 什么是ORM?  ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...

  8. mogoose 创建数据库并增删改查

    下载 npm i mongoose -s 连接数据库 const mongoose = require("mongoose"); mongoose.connect(dbURL); ...

  9. SpringBoot+MyBatis中自动根据@Table注解和@Column注解生成增删改查逻辑

    习惯使用jpa操作对象的方式,现在用mybatis有点不习惯. 其实是懒得写SQL,增删改查那么简单的事情你帮我做了呗,mybatis:NO. 没办法,自己搞喽! 这里主要是实现了通过代码自动生成my ...

随机推荐

  1. bzoj5049: 导航系统

    Description 小Q来到了一个随机的国度.这个国度由n座城市和m条双向道路构成.因为这个国度崇尚随机,因此m条边是用随机 选择两端点的方式生成的.充满好奇的小Q想在这里进行k次随机的旅行,每次 ...

  2. LDAP认证模式简介

    今天发现公共服务中有ldap数据库服务,先大概了解一下ldap,转载下面的文章.原文链接:https://www.jianshu.com/p/d3f8c8f5d661 另外记录一篇文章地址:https ...

  3. 一切为了解决隐私问题,绿洲实验室Ekiden协议介绍

    绿洲实验室官网截图 下一代区块链平台的竞争已经悄然展开,每个月我们都能看到新成立的创业公司宣称,他们要采用区块链解决所有问题.大约80-90%的区块链项目,运行在像Ethereum这样的平台上. 创建 ...

  4. public class PageRender implements ResponseRender

    package cn.ubibi.jettyboot.demotest.controller.render; import cn.ubibi.jettyboot.framework.commons.S ...

  5. I18nUtils

    import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.*; ...

  6. μC/Probe尝鲜

    μC/Probe 1.添加文件 2.配置probe_com_cfg.h 2.1.选择接口 #define PROBE_COM_CFG_RS232_EN DEF_ENABLED /* Configure ...

  7. (Android第一行代码实验一)活动的最佳实践

    活动的最佳实践    1.知晓当前是在哪一个活动         这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动.  首先需要新建一个 BaseActivity 继承自 Activi ...

  8. xsyProblem A: 密集子图(graph)

    f[i][S]三进制压缩表示最长路为i,0代表不在该集合,1代表不是最短路为i集合,2代表是最短路集合, 转移枚举i+1集合是那些, 乘以概率即可 预处理保证复杂度 #include<cstdi ...

  9. Laravel常见问题集锦

    1.提示:Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes? ...

  10. 学习笔记:ECharts

    (Highcharts 167K:  ECharts 354K: jqChart 240K),如果用于网络,Highchart最小 ECharts (Enterprise Charts 商业产品图表库 ...