magento二次开发 - 数据库非EAV模型使用

《深入理解Magento第四章 - 模型和ERM模型》指出,模型的使用分为四步:

  1. 启用模型
  2. 启用资源模型
  3. 在资源模型中添加实体(Entity)。对于简单的模型来说,实体就是数据表的名字
  4. 为资源模型设置读、写适配器

magento中创建并使用一个记录用户信息的数据库

代码框架

配置文件

(1) 修改配置文件后需要清除mageno缓存方可生效
(2) 读、写配置器可以不配置,magento会为没有适配器的资源模型启用默认的适配器,默认的适配器如下面的配置文件所示

<?xml version="1.0"?>
<config>
    <modules>
        <Nano_App>
            <version>0.0.1</version>    <!--配置文件的版本号,很重要,跟我们后面的数据库安装程序有关-->
        </Nano_App>
    </modules>
    <frontend>
        <routers>
            <Nano_App>
                <use>standard</use>
                <args>
                    <module>Nano_App</module>    <!--配置路由规则-->
                    <frontName>app</frontName>
                 </args>
            </Nano_App>
        </routers>
    </frontend>
<global>
        <helpers>
            <nano_app>
                <class>Nano_App_Helper</class>
            </nano_app>
        </helpers>
        <models>
          <app>     <!--模型类唯一标识-->
              <class>Nano_App_Model</class>    <!--指定模型类-->
              <resourceModel>app_mysql4</resourceModel> <!--指定资源模型类-->
          </app>
          <app_mysql4>    <!--资源模型唯一标识-->
              <class>Nano_App_Model_Resource_Mysql4</class>
              <entities>
                  <user>
                     <table>user_account</table>    <!--实体,指定数据库中的表名称-->
                  </user>
              </entities> 
         </app_mysql4>
        </models>
        <resources>
          <app_setup>        <!--指定app模型的安装程序-->
            <setup>
              <module>Nano_App</module>
              <class>Nano_App_Model_Setup_Mysql4_Setup</class>
            </setup>
            <connection>
              <use>core_setup</use>
            </connection>
          </app_setup>
          <app_write>        <!-读配置器->
            <connection>
              <use>default_write</use>
            </connection>
          </app_write>
          <app_read>        <!--写配置器-->
            connection>
              <use>default_read</use>
            </connection>
          </app_read>
        </resources>
    </global>

数据库图形化界面

调试的时候如果不想在终端执行sql语句,可以使用数据库软件

mac环境可以用Sequel Pro
windows环境可以用Navicat

创建mysql数据库 - 安装脚本

为了便于理解magento中的mysql,我们这里直接用magento自带的方法安装数据库,不手动建立数据库了

如代码结构图所示,在sql目录下创app_setup目录,并新建mysql4_install-0.0.1.php
注意,安装程序的版本号需要和config.xml里的版本号保持一致
编辑如下:

<?php
$installer = $this;
$installer->startSetup();
$installer->run("
-- DROP TABLE IF EXISTS {$this->getTable('app/user')};
CREATE TABLE `{$this->getTable('app/user')}` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(32) DEFAULT NULL,
  `pass_word` varchar(32) DEFAULT NULL,
  `schoolName` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
");
$installer->endSetup();

这时候,访问你的magento主页,当加载到APP模块的时候就会执行安装脚本,并创建一张名为user_account的表,表中有四个字段,自增的id,用户名user_name,密码pass_word,学校名称schoolName(这里用驼峰型后面要用)

注1:从app/user到表user_account的过程如下:左边的app是模型名,右边的user是实体名,先寻找名为app的模型,再找它的默认资源模型:app_mysql4,资源模型下寻找名为user的实体,即为user_account

注2:如果安装程序没有生效,查看core_resource表,找到名为app_setup的一项,删除该项,并清空magento的缓存,即可

创建模型

<?php
class Nano_App_Model_User extends Mage_Core_Model_Abstract
{
    public function _construct()
    {
        $this->_init('app/user');
    }
}

创建资源模型

模型类会自动调用资源模型类,资源模型类是与数据库进行对话的组件

<?php
class Nano_App_Model_Resource_Mysql4_User extends Mage_Core_Model_Mysql4_Abstract
{
    public function _construct()
    {
        $this->_init('app/user','id');
    }
}

创建模型集合

通过模型集合,可以同时操作多条记录

<?php
class Nano_App_Model_Resource_Mysql4_User_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
    public function _construct()
    {
        $this->_init('app/user');
    }
}

使用数据库

使用get, set, unset, has方法来进行进行数据的读取、写入、删除、判断是否存在

插入数据

public function insertAction()
    {
        $user = Mage::getModel("app/user");
        // $user->setId(1);        //我们已经设置了`id`字段为自增型,不用给它赋值
        $user->setUserName('mengmeng');
        $user->setPassWord('123');
        // $user->setSchoolName('seu');    //这句话向数据库中插入的字段是`school_name`
        $user->setData('schoolName','seu');    //如果要插入名字是驼峰型的字段,需要使用`setData`方法
        $user->save();
        echo 'saved!';
    }

(1) 对于名称为下划线格式的字段,setUserName('a')等价于setData('user_name','a')
(2) setUserName这样的方法之所以能生效,是因为使用了__set()魔术方法

调用insert接口:


查看数据库:

查询数据

public function selectAction()
    {
        $user = Mage::getModel("app/user");
        $user->load(1);
        echo $user->getUserName().'<br/>';
        echo $user->getData('schoolName').'<hr/>';      //同理,驼峰型的字段只能用`getData`方法取值 
        echo 'selected!';
    }

调用select接口:

getUserName这样的方法之所以能生效,是因为使用了__get()魔术方法

修改数据

public function updateAction()
    {
        $user = Mage::getModel("app/user");
        $user->load(1);
        $user->setUserName('xiamengmeng');
        $user->save();
        echo 'updated!';
    }

调用update接口:


查看数据库:

删除数据

public function delete()
    {
        $user = Mage::getModel("app/user");
        $user->load(1);
        $user->delete();
        echo 'deleted!';
    }

调用delete接口


查看数据库:

获取所有数据

public function collectAction()
    {
        $users = Mage::getModel("app/user")->getCollection();
        foreach($users as $user){
            echo $user->getId().':'.$user->getUserName()."<br/>";
        }
        echo '<hr/>'.'get all data!';
    }

先向数据库中插入几条数据


再调用collect接口

这里用到了前面创建的模型集合类

修改数据库 - 更新脚本

想要对已经创建的数据库进行修改,如增加字段,改变字段属性等,最简单粗暴的方式是直接修改安装脚本,然后在core_resource脚本中删除模块对应的setup,如app_setup,模块就会重新执行安装脚本

这种方法只适合本地调试用

线上有需要修改数据库的,应当使用更新脚本

我们之前创建的表user_account,我们要增加一个字段age

首先修改config.xml的版本号

<?xml version="1.0"?>
<config>
    <modules>
        <Nano_App>
            <version>0.0.2</version>    <!--当需要增加数据库安装脚本时,修改此处的版本号-->
        </Nano_App>
    </modules> 

然后在App模块的sql文件夹下新建mysql4-upgrade-0.0.1-0.0.2.php,文件名表示你要从0.0.1版本升级到0.0.2版本

<?php
$installer = $this;
$installer->startSetup();
$installer->run("
ALTER TABLE `{$this->getTable('app/user')}` ADD `age` INT(4) NOT NULL;
");
$installer->endSetup();

清除缓存后,访问你本地的magento网站

这时,查看数据库,发现age字段已经出现了

再查看core_resource


app模块的版本号也已经成功升级到了0.2.0

FAQ

core_resource表中能找到模块的setup字段,但是数据库的表没有新建成功?

查看数据库安装脚本的版本号与config.xml头部的版本号是否一致

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容