《深入理解Magento第四章 - 模型和ERM模型》指出,模型的使用分为四步:
- 启用模型
- 启用资源模型
- 在资源模型中添加实体(Entity)。对于简单的模型来说,实体就是数据表的名字
- 为资源模型设置读、写适配器
在magento
中创建并使用一个记录用户信息的数据库
代码框架
配置文件
(1) 修改配置文件后需要清除
mageno
缓存方可生效
(2) 读、写配置器可以不配置,magento
会为没有适配器的资源模型启用默认的适配器,默认的适配器如下面的配置文件所示
0.0.1
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
connection>
数据库图形化界面
调试的时候如果不想在终端执行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
(这里用驼峰型后面要用)
注1:从
app/user
到表user_account
的过程如下:左边的app
是模型名,右边的user
是实体名,先寻找名为app
的模型,再找它的默认资源模型:app_mysql4
,资源模型下寻找名为user
的实体,即为user_account
注2:如果安装程序没有生效,查看
core_resource
表,找到名为app_setup
的一项,删除该项,并清空magento的缓存,即可
创建模型
_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
接口:
查看数据库:
查询数据
public function selectAction()
{
$user = Mage::getModel("app/user");
$user->load(1);
echo $user->getUserName().'
';
echo $user->getData('schoolName').'
'; //同理,驼峰型的字段只能用`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()."
";
}
echo '
'.'get all data!';
}
先向数据库中插入几条数据
再调用
collect
接口
这里用到了前面创建的模型集合类
修改数据库 - 更新脚本
想要对已经创建的数据库进行修改,如增加字段,改变字段属性等,最简单粗暴的方式是直接修改安装脚本,然后在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
字段已经出现了
再查看core_resource
表
app
模块的版本号也已经成功升级到了
0.2.0
FAQ
core_resource
表中能找到模块的setup
字段,但是数据库的表没有新建成功?
查看数据库安装脚本的版本号与config.xml
头部的版本号是否一致