Doctrine可以很方便的生成模型,方法也是有多种。本例按手册上的通过已存在的数据表来生成与之对应的模型 。
请确认是否已经有了名叫doctrine_test的数据表并且已经是当前所打开的库。费话少说,直接上手册的测试数据:
CREATE TABLE user (
id bigint(20) NOT NULL auto_increment,
first_name varchar(255) default NULL,
last_name varchar(255) default NULL,
username varchar(255) default NULL,
password varchar(255) default NULL,
type varchar(255) default NULL,
is_active tinyint(1) default '1',
is_super_admin tinyint(1) default '0',
created_at TIMESTAMP,
updated_at TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB
运行语句,ok! user表已存在了doctrine_test数据库中,准备工作已经完成.
修改bootstrap.php内容为:
$conn = Doctrine_Manager::connection('mysql://root:123456@localhost/doctrine_test', 'doctrine');
然后需要在doctrine_test目录中创建一个名为models的子目录
$mkdir doctrine_test/models
(注:此目录应要有写入的权限,doctrine会将数据表对应的模型代码会写入该目录中)
在test.php文件中加入以下生成模型的代码:
Doctrine_Core::generateModelsFromDb('models', array('doctrine'),array('generateTableClasses' => true));
保存,运行test.php。模型生成
现在我们能在models目录中的generate子目录中看到BaseUser.php。这个表里面便是user表对应的完整模型,Doctrine还在这个文件中自动生成了一个setUp()函数。与此同时,在doctrine_test的models目录下会生成User.php和UserTable.php。为什么一个数据模型会同时生成三个文件呢,以后再边做测试边解释
看一下是具体是怎样运用Doctrine调用数据的:
在//models/User.php文件中新增一个SetPassword()函数,内容如下,照拿手册上的例子
class User extends BaseUser
{
public function setPassword($password)
{
return $this->_set('password', md5($password));
}
}
要让这个函数起作用,必須还要开启auto_accessor_override属性。现在在bootstrap.php中添加Doctrine_Core::loadModels('models'); 然后设置password时理应便会自动进行加密了.
下面贴出主要的代码:
//models/User.php
class User extends BaseUser
{
public function setPassword($password)
{
return $this->_set('password',md5($password));
}
}
//bootstrap.php
require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
$manager = Doctrine_Manager::getInstance();
$conn = Doctrine_Manager::connection('mysql://root:123456@localhost/doctrine_test','doctrine');
$manager->setAttribute(Doctrine_Core::ATTR_VALIDATE,Doctrine_Core::VALIDATE_ALL);
$manager->setAttribute(Doctrine_Core::ATTR_EXPORT,Doctrine_Core::EXPORT_ALL);
$manager->setAttribute(Doctrine_Core::ATTR_MODEL_LOADING,Doctrine_Core::MODEL_LOADING_CONSERVATIVE);
$manager->setAttribute(Doctrine_Core::ATTR_AUTOLOAD_TABLE_CLASSES,true);
$manager->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE,true);
Doctrine_Core::loadModels('models');
//test.php ,这个文件就是完全拿例子,作者的名字都不改
require_once('bootstrap.php');
$user = new User();
$user->username = 'jwage';
$user->password = 'changeme';
echo $user->password;
现在运行test.php,但是却得到了Fatal error : Class 'User' not found in /home/www/example/doctrine_test/test.php 的 错误。多次查看文档感觉应该是没有什么错误呀,原本就是照着手册一步一步做的。google了很多也没有找到原因,最后还查看了symfony的Doctrineplugin配置文件进行对比,也没有解决问题。最后终于在Doctrine的官方论坛中找到了答案,
原因是因为model autoloader在我这个运行的Doctrine 1.2中没有被默认加载。那上面给出的解释是应该是修复这个bug了,但是我的这个环境里面却没有自动加载
在bootstrap.php文件中加入
spl_autoload_register(array('Doctrine_Core', 'modelsAutoload'));
再次运行test.php
搞定: 显示 4cb9c8a8048fd02294477fcb1a41191a
问题解决!
相关链接:
http://www.doctrine-project.org/jira/browse/DC-344