モデルの属性

モデルの属性を用いて、デフォルトのモデルの振る舞いを上書きできるプロパティを 設定することができます。

モデルの属性の完全なリストと説明については、 CakePHP API をご覧ください。

useDbConfig

useDbConfig プロパティはモデルクラスを関連するデータベース・テーブルに紐付けるために用いられる、 データベース・コネクションの名前を指定する文字列になります。 データーベース設定ファイルに定義されたデータベースコレクションのうちどれか一つを設定できます。 データベース設定ファイルは /app/Config/database.php に保存します。

useDbConfig プロパティの初期値は「default」データベース・コネクションになります。

使用例:

class Example extends AppModel {
    public $useDbConfig = 'alternate';
}

useTable

useTable プロパティはデータベースのテーブル名を指定します。 デフォルトでは、モデルのクラス名の小文字の複数形が用いられます。 この属性を他のテーブル名にするか、 データベース・テーブルをこのモデルで使いたくない場合、 false を指定してください。

使用例:

class Example extends AppModel {
    public $useTable = false; // このモデルはデータベース・テーブルを使いません
}

あるいは:

class Example extends AppModel {
    public $useTable = 'exmp'; // このモデルは「exmp」というデータベース・テーブルを使います
}

tablePrefix

モデルで使われるテーブルの接頭辞 (prefix) の名前です。テーブル接頭辞は /app/Config/database.php にあるデータベース・コネクションのファイルで初期値が設定されます。 デフォルトでは接頭辞はありません。モデルで tablePrefix 属性を設定することで初期値を 上書きすることができます。

使用例:

class Example extends AppModel {
    public $tablePrefix = 'alternate_'; // 「alternate_examples」を見に行く
}

primaryKey

各々のテーブルは通常、 id という主キーを持ちますが、 モデルがどのフィールド名を主キーとして使うか変えることができます。 これは CakePHP に既存のデータベース・テーブルを使用させる場合、よくあることです。

使用例:

class Example extends AppModel {
    // example_idは データベースのフィールド名
    public $primaryKey = 'example_id';
}

displayField

displayField 属性はどのデータベースのフィールドがレコードの表題 (label) として 使われるべきかを指定します。この表題はスキャフォールディングと find('list') の呼び出しで 用いられます。モデルはデフォルトで、 nametitle を使います。

例えば、 username フィールドを使うには以下のようにします:

class User extends AppModel {
    public $displayField = 'username';
}

複数のフィールド名は組み合わせて一つのディスプレイフィールド (display field) に 結合することはできません。例えば、 array('first_name', 'last_name') を ディスプレイフィールドとして指定することはできません。 代わりにモデルの属性である virtualFields でバーチャルフィールドを作成してください。

recursive

recursive プロパティは CakePHP が find()read() メソッドを通して、どのぐらい深く関連モデルのデータを取得すべきかを定義します。

アプリケーションががあるドメインに属している Group があり (belongsTo)、 Group が多くの User を持ち (hasMany)、同様に User が多くの Article を持っているとします。 $this->Group->find() を呼び出し、取得したいデータ量に基づいて、$recursive に異なる値を 設定することができます:

  • -1 CakePHP は Group のデータだけを取得します。join しません。
  • 0 CakePHP は Group のデータとそのドメインを取得します。
  • 1 CakePHP は1つの Group とそのドメインとそれに関連した User を取得します。
  • 2 CakePHP は1つの Group とそのドメインとそれに関連した User と各 User に関連した Article を取得します。

必要以上に高く設定しないでください。CakePHP がデータを取得する際に、 不必要にアプリケーションを遅くしたくないでしょう。 また、recursive レベルの初期値が 1 であることも覚えていてください。

注釈

$recursive と fields の機能を組み合わせたい場合、 手動で fields 配列に必要な外部キーを含むカラムを追加しなければなりません。 上記の例では、 domain_id を追加することになります。

ちなみに

recursive レベルは -1 にしておいたほうがよいでしょう。 こうしておくと、不要な関連データを取得してしまうのを回避できます。 これは、おそらく find() を呼び出すほとんどの場合に望ましい結果になります。 必要な場合にのみ recursive レベルを設定して関連データを取得させるか、もしくは Containable ビヘイビアを使いましょう。

AppModel に次のような設定を追加します。:

public $recursive = -1;

order

find 操作のデフォルトのデータの順番。下記のような設定が可能です。

$order = "field"
$order = "Model.field";
$order = "Model.field asc";
$order = "Model.field ASC";
$order = "Model.field DESC";
$order = array("Model.field" => "asc", "Model.field2" => "DESC");

data

モデルの取得したデータ用のコンテナになります。モデルクラスから返されたデータは通常 find() 呼び出しの返り値として使用されますが、モデルのコールバック内で $data に保存された情報に アクセスする必要がある場合があります。

_schema

データベーステーブルフィールドの詳細であるメタデータをもちます。 各フィールドは次のようになっています:

  • name
  • type

The types CakePHP supports are:

string
Generally backed by CHAR or VARCHAR columns. In SQL Server, NCHAR and NVARCHAR types are used.
text
Maps to TEXT, MONEY types.
uuid
Maps to the UUID type if a database provides one, otherwise this will generate a CHAR(36) field.
integer
Maps to the INTEGER, SMALLINT types provided by the database.
biginteger
Maps to the BIGINT type provided by the database.
decimal
Maps to the DECIMAL, NUMERIC types.
float
Maps to the REAL, DOUBLE PRECISION types.
boolean
Maps to BOOLEAN except in MySQL, where TINYINT(1) is used to represent booleans.
binary
Maps to the BLOB or BYTEA type provided by the database.
date
Maps to a timezone naive DATE column type.
datetime
Maps to a timezone naive DATETIME column type. In PostgreSQL, and SQL Server this turns into a TIMESTAMP or TIMESTAMPTZ type.
timestamp
Maps to the TIMESTAMP type.
time
Maps to a TIME type in all databases.
  • null
  • default value
  • length

使用例:

protected $_schema = array(
    'first_name' => array(
        'type' => 'string',
        'length' => 30
    ),
    'last_name' => array(
        'type' => 'string',
        'length' => 30
    ),
    'email' => array(
        'type' => 'string',
        'length' => 30
    ),
    'message' => array('type' => 'text')
);

validate

この属性は、モデルが保存前にデータバリデーションの判定を行うルールを保持します。 フィールドにちなんで名付けられたキーが正規表現の値をもつことで、 モデルがマッチングをすることができます。

注釈

save() はデータを実際に保存する前に自動的にバリデーションを行うので、 save() の前に validate() を呼ぶ必要はありません。

バリデーションに関する詳しい情報は、このマニュアルの後にある /models/data-validation を ご覧ください。

virtualFields

モデルが持つバーチャルフィールドの配列です。バーチャルフィールドは SQL 表現へのエイリアスです。 このプロパティに追加されたフィールドは、他のモデルフィールドと同じように読み込まれますが、 保存することはできません。

MySQL での使用例:

public $virtualFields = array(
    'name' => "CONCAT(User.first_name, ' ', User.last_name)"
);

これを行った後、find 操作で取得したデータの User には name キーに連結された結果が 格納されているでしょう。データベースにバーチャルフィールドと同じ名前のカラムを作成するのは 賢明ではありません。これは SQL エラーを引き起こす場合があります。

virtualFields プロパティに関する詳しい情報、正しい用法、また制限については、 バーチャルフィールド をご覧ください。

name

モデルの名前。モデルのファイルでこれを指定しない場合、コンストラクタでクラス名が設定されます。

使用例:

class Example extends AppModel {
    public $name = 'Example';
}

cacheQueries

true を設定すると、モデルによって取得されたデータは1つのリクエストの間キャッシュされます。 このキャッシュはメモリ内のみで、リクエストの間のみ持続します。 同じデータに対する重複したリクエストはキャッシュによって処理されます。