primaryKey¶
各々のテーブルは通常、 id
という主キーを持ちますが、
モデルがどのフィールド名を主キーとして使うか変えることができます。
これは CakePHP に既存のデータベース・テーブルを使用させる場合、よくあることです。
使用例:
class Example extends AppModel {
// example_idは データベースのフィールド名
public $primaryKey = 'example_id';
}
This document is for a version of CakePHP that is no longer supported. Please upgrade to a newer release!
モデルの属性を用いて、デフォルトのモデルの振る舞いを上書きできるプロパティを 設定することができます。
モデルの属性の完全なリストと説明については、 CakePHP API をご覧ください。
useDbConfig
プロパティはモデルクラスを関連するデータベース・テーブルに紐付けるために用いられる、
データベース・コネクションの名前を指定する文字列になります。
データーベース設定ファイルに定義されたデータベースコレクションのうちどれか一つを設定できます。
データベース設定ファイルは /app/Config/database.php に保存します。
useDbConfig
プロパティの初期値は「default」データベース・コネクションになります。
使用例:
class Example extends AppModel {
public $useDbConfig = 'alternate';
}
useTable
プロパティはデータベースのテーブル名を指定します。
デフォルトでは、モデルのクラス名の小文字の複数形が用いられます。
この属性を他のテーブル名にするか、
データベース・テーブルをこのモデルで使いたくない場合、 false
を指定してください。
使用例:
class Example extends AppModel {
public $useTable = false; // このモデルはデータベース・テーブルを使いません
}
あるいは:
class Example extends AppModel {
public $useTable = 'exmp'; // このモデルは「exmp」というデータベース・テーブルを使います
}
モデルで使われるテーブルの接頭辞 (prefix) の名前です。テーブル接頭辞は
/app/Config/database.php にあるデータベース・コネクションのファイルで初期値が設定されます。
デフォルトでは接頭辞はありません。モデルで tablePrefix
属性を設定することで初期値を
上書きすることができます。
使用例:
class Example extends AppModel {
public $tablePrefix = 'alternate_'; // 「alternate_examples」を見に行く
}
各々のテーブルは通常、 id
という主キーを持ちますが、
モデルがどのフィールド名を主キーとして使うか変えることができます。
これは CakePHP に既存のデータベース・テーブルを使用させる場合、よくあることです。
使用例:
class Example extends AppModel {
// example_idは データベースのフィールド名
public $primaryKey = 'example_id';
}
displayField
属性はどのデータベースのフィールドがレコードの表題 (label) として
使われるべきかを指定します。この表題はスキャフォールディングと find('list')
の呼び出しで
用いられます。モデルはデフォルトで、 name
か title
を使います。
例えば、 username
フィールドを使うには以下のようにします:
class User extends AppModel {
public $displayField = 'username';
}
複数のフィールド名は組み合わせて一つのディスプレイフィールド (display field) に
結合することはできません。例えば、 array('first_name', 'last_name')
を
ディスプレイフィールドとして指定することはできません。
代わりにモデルの属性である virtualFields でバーチャルフィールドを作成してください。
recursive プロパティは CakePHP が find()
、 read()
メソッドを通して、どのぐらい深く関連モデルのデータを取得すべきかを定義します。
仮にアプリケーションの仕様として Group が Domain に属しており (belongsTo) 、 多くの User を持ち (hasMany) 、さらに User が多くの Article を持っているとします。 $this->Group->find() の呼び出しから返したいデータ量に基づいて、 $recursive に次のような異なる値を設定することができます。
-1 CakePHP は Group のデータだけを取得します。join しません。
0 CakePHP は Group のデータとその Domain を取得します。
1 CakePHP は Group 、その Domain 、および関連する User を取得します。
2 CakePHP は Group 、その Domain 、関連する User 、および User に関連する Article を取得します。
必要以上に高く設定しないでください。CakePHP がデータを取得する際に、 不必要にアプリケーションを遅くしたくないでしょう。 また、recursive レベルの初期値が 1 であることも覚えていてください。
注釈
$recursive と fields
の機能を組み合わせたい場合、
手動で fields
配列に必要な外部キーを含むカラムを追加しなければなりません。
上記の例では、 domain_id
を追加することになります。
Tip
recursive レベルは -1 にしておいたほうがよいでしょう。 こうしておくと、不要な関連データを取得してしまうのを回避できます。 これは、おそらく find() を呼び出すほとんどの場合に望ましい結果になります。 必要な場合にのみ recursive レベルを設定して関連データを取得させるか、もしくは Containable ビヘイビアを使いましょう。
AppModel に次のような設定を追加します。:
public $recursive = -1;
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");
モデルの取得したデータ用のコンテナになります。モデルクラスから返されたデータは通常 find() 呼び出しの返り値として使用されますが、モデルのコールバック内で $data に保存された情報に アクセスする必要がある場合があります。
データベーステーブルフィールドの詳細であるメタデータをもちます。 各フィールドは次のようになっています:
name
type
CakePHP がサポートする型は:
一般的には、CHAR または VARCHAR のカラムを使用します。SQL Server では、 NCHAR や NVARCHAR の型が使用されます。
TEXT や MONEY の型に対応します。
データベースが UUID 型を提供する場合は UUID 型に対応し、 そうでなければ CHAR(36) 型のフィールドを生成します。
データベースが提供する TINYINT または SMALLINT 型に対応します。
テータベースが提供する SMALLINT 型に対応します。
データベースが提供する INTEGER 型に対応します。
データベースが提供する BIGINT 型に対応します。
DECIMAL や NUMERIC 型に対応します。
REAL や DOUBLE PRECISION 型に対応します。
MySQL 以外は BOOLEAN。ここで TINYINT(1) は boolean を表すために使用されます。
データベースが提供する BLOB または BYTEA 型に対応します。
タイムゾーン無しの DATE カラム型に対応します。
タイムゾーン無しの DATETIME カラム型に対応します。PostgreSQL や SQL Server では、 TIMESTAMP または TIMESTAMPTZ 型に変わります。
TIMESTAMP 型に対応します。
全てのデータベースで TIME 型に対応します。
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')
);
バージョン 2.10.0 で変更: smallinteger
型と tinyinteger
型は 2.10.0 で追加されました。
この属性は、モデルが保存前にデータバリデーションの判定を行うルールを保持します。 フィールドにちなんで名付けられたキーが正規表現の値をもつことで、 モデルがマッチングをすることができます。
注釈
save() はデータを実際に保存する前に自動的にバリデーションを行うので、 save() の前に validate() を呼ぶ必要はありません。
バリデーションに関する詳しい情報は、このマニュアルの後にある /models/data-validation を ご覧ください。
モデルが持つバーチャルフィールドの配列です。バーチャルフィールドは SQL 表現へのエイリアスです。 このプロパティに追加されたフィールドは、他のモデルフィールドと同じように読み込まれますが、 保存することはできません。
MySQL での使用例:
public $virtualFields = array(
'name' => "CONCAT(User.first_name, ' ', User.last_name)"
);
これを行った後、find 操作で取得したデータの User には name
キーに連結された結果が
格納されているでしょう。データベースにバーチャルフィールドと同じ名前のカラムを作成するのは
賢明ではありません。これは SQL エラーを引き起こす場合があります。
virtualFields
プロパティに関する詳しい情報、正しい用法、また制限については、
バーチャルフィールド をご覧ください。
モデルの名前。モデルのファイルでこれを指定しない場合、コンストラクタでクラス名が設定されます。
使用例:
class Example extends AppModel {
public $name = 'Example';
}
true を設定すると、モデルによって取得されたデータは1つのリクエストの間キャッシュされます。 このキャッシュはメモリ内のみで、リクエストの間のみ持続します。 同じデータに対する重複したリクエストはキャッシュによって処理されます。