2

从该模型生成表时:

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”将被定义为整数并具有“reference”类型,并且还将添加一个字段“publisher”,具有完全相同的属性 - 但它将是一个计算字段并将使用子选择确定价值。

我想知道:

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

1 回答 1

1

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

之所以这样做,是因为 refModel() 实际上在模型中创建了两个字段,一个用于编辑(_id),另一个用于列出数据(作为子查询)

使用 refModel 时,应使用“Model_Person”。refModel、setModel 等字段的一致性在 4.2 中会有所改进,由于兼容性原因没有做。

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

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

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

于 2011-10-08T21:32:04.367 回答