SchemaGenerator дополнительное поле VARCHAR, почему? - PullRequest
2 голосов
/ 08 октября 2011

При создании таблицы из этой модели:

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 я получаю противоположное тому, что сказано в руководстве:

Вызов refModel с именем поля, оканчивающимся на «_id», фактически создаст 2 определения поля. «publisher_id», например, будет определен как целое число и будет иметь тип «reference» , а также будет добавлено поле «publisher» с точно такими же свойствами - но это будет вычисляемое поле и будет использовать суб-выбор для определения значения.

Я хочу знать:

  1. Правильно ли сформирован оператор SQL?
  2. Что делает это дополнительное сгенерированное поле VARCHAR? (Я сделал CRUD и при добавлении новых записей значение этого поля было сохранено как NULL).
  3. При использовании refModel(), если я использовал только имя модели («Person»), я получил ошибку (невозможно включить Person.php), мне пришлось использовать полное имя класса («Model_Person»). Это нормально? я не могу использовать только название модели?
  4. mandatory() не использует NOT NULL, есть ли способ сделать это?

1 Ответ

1 голос
/ 09 октября 2011

Сгенерированный оператор SQL неверен.Это ошибка в генераторе.Вам нужно только одно поле типа «int», оканчивающееся на _id.

Причина, по которой это происходит, заключается в том, что refModel () фактически создает два поля в модели, одно из которых используется для редактирования (_id), а другое - для вывода данных (в качестве подзапроса).

Когда вы используете refModel, вы должны использовать "Model_Person".Согласованность между refModel, setModel и другими полями будет улучшена в 4.2, это не сделано из соображений совместимости.

Генератор SQL по своей природе неполон и не может быть полным, поэтому лучше эту схемурассматривается в любом случае.Например, у вас могут быть некоторые поля, которые не определены в «Модель».Также я предпочитаю, чтобы разработчики обращали внимание на SQL, так как он может не точно отражать модели, одна модель может использовать несколько таблиц через объединение, или модели могут наследовать каждую, а затем добавлять туда дополнительные определения полей.

required () - это модель-требование уровня, которое работает аналогично другим проверкам.Хотя MySQL может справиться с «обязательным» условием, он не сможет справиться с другими.Кроме того, вы можете удалить «обязательный» при наследовании моделей.

Я постараюсь добавить руководство по эффективному использованию моделей в Agile Toolkit.

...