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

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

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

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

代码框架

magento二次开发 - 数据库非EAV模型使用_第1张图片

配置文件

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



    
        
            0.0.1    
        
    
    
        
            
                standard
                
                    Nano_App    
                    app
                 
            
        
    

        
            
                Nano_App_Helper
            
        
        
               
              Nano_App_Model    
              app_mysql4 
          
              
              Nano_App_Model_Resource_Mysql4
              
                  
                     user_account
Nano_App Nano_App_Model_Setup_Mysql4_Setup core_setup default_write connection> default_read

数据库图形化界面

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

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

创建mysql数据库 - 安装脚本

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

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

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(这里用驼峰型后面要用)

magento二次开发 - 数据库非EAV模型使用_第2张图片

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

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

magento二次开发 - 数据库非EAV模型使用_第3张图片

创建模型

_init('app/user');
    }
}

创建资源模型

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

_init('app/user','id');
    }
}

创建模型集合

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

_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接口:


查看数据库:
magento二次开发 - 数据库非EAV模型使用_第4张图片

查询数据

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

调用select接口:

magento二次开发 - 数据库非EAV模型使用_第5张图片

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()."
"; } echo '
'.'get all data!'; }

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

magento二次开发 - 数据库非EAV模型使用_第6张图片

再调用 collect接口
magento二次开发 - 数据库非EAV模型使用_第7张图片

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

修改数据库 - 更新脚本

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

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

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

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

首先修改config.xml的版本号



    
        
            0.0.2    
        
     

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

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

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

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

magento二次开发 - 数据库非EAV模型使用_第8张图片

再查看core_resource


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

FAQ

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

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

你可能感兴趣的:(magento二次开发 - 数据库非EAV模型使用)