`
半醉小仔
  • 浏览: 6477 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

用Doctrine生成数据库模型

阅读更多

 

 

    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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics