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" 型のフィールドが 1 つだけ必要です。

これを行う理由は、refModel() が実際にモデルに 2 つのフィールドを作成し、そのうちの 1 つは編集 (_id) に使用され、もう 1 つはデータのリスト (サブクエリとして) に使用されるためです。

refModel を使用する場合は、"Model_Person" を使用する必要があります。refModel、setModel、およびその他のフィールド間の一貫性は 4.2 で改善されますが、互換性の理由により行われていません。

SQL ジェネレーターはその性質上不完全であり、完全にすることはできません。そのため、とにかくスキーマを見直した方がよいでしょう。たとえば、「モデル」で定義されていないフィールドがいくつかある場合があります。また、SQL はモデルを正確に反映していない可能性があるため、開発者は SQL に注意を払うことを好みます。1 つのモデルが結合によって複数のテーブルを使用したり、モデルがそれぞれを継承してそこにフィールド定義を追加したりする可能性があります。

Required() は、他の検証と同様に機能するモデル レベルの要件です。MySQL は「必須」条件を処理できますが、他の条件を処理することはできません。また、モデルを継承する場合は、「必須」を削除できます。

Agile Toolkit でモデルを効果的に使用するためのガイドを追加しようと思います。

于 2011-10-08T21:32:04.367 に答える