SchemaGenerator额外的VARCHAR字段,为什么?

问题描述:

当从这个模型生成表:SchemaGenerator额外的VARCHAR字段,为什么?

function init() 
{ 
    parent::init(); 
    $this->addField('person_id')->refModel('Model_Person')->mandatory(true); 
    $this->addField('username')->mandatory(true);  
    $this->addField('password')->mandatory(true);  
} 

我得到这个SQL语句:

create table users (  
    id int auto_increment not null primary key, 
    person_id varchar(255), 
    person int(11), 
    username varchar(255), 
    password varchar(255)); 

在这个SQL语句中,我得到什么教程说的正好相反:

使用以“_id”结尾的字段名称调用refModel实际上会创建2个字段定义。例如,“publisher_id”将被定义为整数并且将具有类型“参考”,并且还会添加字段“发布者”,其具有完全相同的属性 - 但它将是计算字段并将使用子字段,选择确定值。

我想知道:

  1. 是生成的SQL语句是否正确?
  2. 此VARCHAR额外生成的字段是做什么的? (我做了CRUD,当添加新记录时,这个字段的值被保存为NULL)。当我使用refModel()时,如果我只使用了模型名称('Person'),我得到了一个错误(无法包含Person.php),我不得不使用完整的类名('Model_Person')。这个可以吗?我不应该只能使用模型名称?
  3. mandatory()不使用NOT NULL,有没有办法做到这一点?

生成的SQL语句不正确。这是发生器中的一个错误。你只需要一个字段o类型“int”以_id结尾。

它之所以这样做,是因为refModel()实际创建模型两个领域,其中之一是用于编辑(_id)和其他用于列表数据(如一个子查询)

当你使用refModel时,你应该使用“Model_Person”。由于兼容性原因,refModel,setModel和其他字段之间的一致性将在4.2中得到改进。

SQL生成器的本质是不完整的,它不能完成,因此无论如何都最好检查模式。例如,您可能有一些未在“模型”中定义的字段。此外,我更喜欢开发人员注意SQL,因为它可能不会精确地反映模型,一个模型可能会通过连接使用多个表,或者模型可能会继承每个表,然后在其中添加更多字段定义。

mandatory()是与其他验证类似的模型级要求。虽然MySQL可以处理“强制性”条件,但它无法处理其他问题。此外,您可以在继承模型时删除“强制”。

我会尝试添加一个关于在Agile Toolkit中有效使用模型的指南。