Orm
ORMはオブジェクト
関係マッピングの略です。 これは、2つのことを行います: オブジェクトにデータベースのテーブルの行をマップし、
それはあなたがそれらのオブジェクト間の関係を確立することができます。
それは
Active Record パターンに従いますが、 他のシステムに影響も受けます。
リレーション:多対多
別のモデルに多対多のリレーションシップを指定します。対象モデルは、他の方向の関係と 同じ型を持ちます。 双方のテーブルの間に、デュアルプライマリーキーとして使用する 2IDがあれば、 リレーションが可能です。
値と関係を保つ
リレーションシップ·テーブルに値を保存する必要がある場合は、ManyManyを使用していますが、 そうでなければManyMany関係と呼ぶようなものの両側に 属する代わりの間でモデルを作成する必要はありません。それについては、入れ子になったリレーションシップの使用法 で説明されています。
設定オプション
ManyMany関係は他の人に比べて3つの追加の設定オプションがあります。 最も一般的な命名規則を使用するときは、これらのすべてはまだオプションです。
オプション | デフォルト | 説明 |
---|---|---|
table_through | アルファベット順に、model_toとmodel_fromから算出 | これは、2つのモデルを接続し、そこに両方それらのIDを持つテーブルです。 Model_UserとModel_Postのような2つのモデルの場合は、 デフォルトでposts_users(両方の複数形)という名前になります。 |
key_through_from | 現在のモデル名から算出 | 現行モデルの主キーと一致するキー。 現在のモデルはModel_Postの場合、 これはデフォルトでpost_idとなります。 |
key_through_to | 関連するモデル名から算出 | 関連モデルの主キーと一致するキー。 関連モデルがModel_Userである場合、 これはデフォルトでuser_idとなります。 |
Ordering on a column in the through table
In addition to the normal default order you can define in a relationship definition, you can also define now the records from table_through need to be ordered:
protected static $_many_many = array(
'users' => array(
'table_through' => 'posts_users', // both models plural without prefix in alphabetical order
'order_by' => array(
'posts_users.status' => 'ASC' // define custom through table ordering
),
)
);
// other fields that may be required have been ommitted for this example
Example
Model_Postがあるします。そしてそれは Model_Userなどと多くを持って、多くに属しています。
Model_PostのIDは、呼ばれるテーブルposts_usersに、Model_UserのIDとともにあります。
(デフォルトの順序はアルファベット順です) そのテーブルは、ちょうど2カラムがあります。:
post_id と user_id は共にそれらのテーブルの主キーです。
あなたがデフォルトを維持する場合に必要な作業は 'users'の為に、
$_many_manyをModel_Postの静的プロパティに加えることです。:
protected static $_many_many = array('users');
そして、あなたはSQLにこのようなテーブルを追加する必要があります:
CREATE TABLE IF NOT EXISTS `posts_users` (
`post_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`post_id`,`user_id`)
);
has-manyリレーションを確立し、解消するための例:
// 両方のメインと関連オブジェクトが新たに追加:
$post = new Model_Post();
$post->users[] = new Model_User();
$post->save();
// 両方のメインと関連オブジェクトが既に存在している
$user = Model_User::find(8);
$user->posts[1] = Model_Post::find(1);
$user->save();
// 上に確立された関係を解消する。
$post = Model_Post::find(1);
unset($post->users[8]);
$post->save();
デフォルト値を持つ完全な設定例
// Model_Post の中身は、多くのユーザーに属しています。
// = ユーザーごとに複数のポストとポストごとに複数のユーザ(著者)があります。
protected static $_many_many = array(
'users' => array(
'key_from' => 'id',
'key_through_from' => 'post_id', // テーブル間のカラム1は、posts.idと一致する必要があります
'table_through' => 'posts_users', // アルファベット順にプレフィックスなしの複数のmodel双方に
'key_through_to' => 'user_id', // テーブル間のカラム2は、users.idと一致する必要があります
'model_to' => 'Model_User',
'key_to' => 'id',
'cascade_save' => true,
'cascade_delete' => false,
)
);