我的一个项目中存在问题,我将Doctrine用作ORM。
出于某种原因,在重建模型和数据库结构时,Doctrine忽略了行为和关系,我在其中一个表定义中定义。 YAML表定义如下所示:
...
User:
actAs:
Timestampable:
Sluggable:
unique: true
fields: username
canUpdate: true
columns:
id:
type: integer(4)
primary: true
autoincrement: true
company_id
type: integer(4)
timezone_id:
type: integer(1)
role_id:
type: integer(1)
email:
type: string(255)
username:
type: string(255)
unique: true
password:
type: string(40)
firstname:
type: string(255)
lastname:
type: string(255)
last_login:
type: datetime
relations:
Company:
local: company_id
foreign: id
Timezone:
local: timezone_id
foreign: id
Role:
local: role_id
foreign: id
...
生成的表结构如下所示:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`company_id` int(11) DEFAULT NULL,
`timezone_id` tinyint(4) DEFAULT NULL,
`role_id` tinyint(4) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
`password` varchar(40) DEFAULT NULL,
`firstname` varchar(255) DEFAULT NULL,
`lastname` varchar(255) DEFAULT NULL,
`last_login` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
正如您所看到的,Doctrine生成了我定义的所有列,但由于某种原因,所有应该自动发生的事情都没有完成。首先,它不会为Timestampable行为创建updated_at
和created_at
列,并且还会丢失Sluggable行为的slug
列。
索引和外键约束也缺失。
当我打开生成的模型类时,它看起来很好:
class BaseUser extends Doctrine_Record
{
....
public function setUp()
{
parent::setUp();
$this->hasOne('Company', array(
'local' => 'company_id',
'foreign' => 'id'));
$this->hasOne('Timezone', array(
'local' => 'timezone_id',
'foreign' => 'id'));
$this->hasOne('Role', array(
'local' => 'role_id',
'foreign' => 'id'));
$timestampable0 = new Doctrine_Template_Timestampable();
$sluggable0 = new Doctrine_Template_Sluggable(array(
'unique' => true,
'fields' => 'username',
'canUpdate' => true,
));
$this->actAs($timestampable0);
$this->actAs($sluggable0);
}
....
}
所以,问题出在SQL查询生成......
是否有其他人遇到类似问题,或者您是否可以发现我的YAML定义中的任何错误?
答案 0 :(得分:0)
根据您发布的内容以及后续评论,您的User
表和mysql
。user
表格会出现名称冲突。正如您在将表重命名为Person
时提到的那样,它按预期工作。
根据我的经验,我总是在表格中添加一个任意表格前缀,以避免出现这些意外行为。