Orm
ORM はオブジェクト関係マッピングの略です。
これは、 2 つのことを行います: オブジェクトにデータベースのテーブルの行をマップし、
それはあなたがそれらのオブジェクト間の関係を確立することができます。
それは Active Record パターン
に従いますが、 他のシステムにも影響も受けます。
リレーション:多対多
別のモデルに多対多のリレーションシップを指定します。対象モデルは、他の方向の関係と 同じ型を持ちます。 双方のテーブルの間に、デュアルプライマリーキーとして使用する 2 つの ID があれば、リレーションが可能です。
値と関係を保つ
リレーションシップテーブルに値を保存する必要がある場合は、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 となります。 |
スルーテーブル内のカラムの順序付け
リレーションシップ定義で定義することができ、通常のデフォルトの順序に加えて、順序付けらた table_through からのレコードを今必要であれば定義できます:
protected static $_many_many = array(
'users' => array(
'table_through' => 'posts_users', // both models plural without prefix in alphabetical order
'conditions' => array(
'order_by' => array(
'posts_users.status' => 'ASC' // define custom through table ordering
),
),
)
);
// この例のために必要とされている他のフィールドは省略されている
The conditions array can also contain where clauses, which will act as a permanent filter on the related table results.
例
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,
)
);