schema.yml:
Author:
name: varchar(255)
Article:
title: varchar(255)
author_id:
のように、カラム名に <主テーブル名>_id という名前を付けると、参照テーブル(Article) には,主テーブル名(Author)への foreign key が作られ、 propel のモデルクラスでそれぞれのリレーションに対する専用のメソッドが提供されて簡単にリレーションができるようになります。
前述の Author, Article ならばモデル生成時に次のようなメソッドが自動生成されます。
class BaseAuthor {
public function getArticles();
public function addArticle($article);
}
class BaseArticle{
public funtcion getAuthor();
public function setAuthor($author);
}
この場合, addArticle() という名前のメソッドを呼び出すと、外部キーが適切に設定されるだけでなく、メソッドを呼んだオブジェクトが save() された場合に、このメソッドで引数にしてあるオブジェクト全てに対して save() を要求してくれます。複数指定可能なので set でなく add になっているわけです。
また、getArticles() メソッドを使うと、実行インスタンス(の元になるレコード)を参照している、 Article テーブルの全てのレコードの Article クラスインスタンスを取得できます。
逆に、参照元のテーブルである Article クラスのインスタンスから getAuthor() を呼ぶことで、そのインスタンスが参照している Author クラスのインスタンスを得ることができます。
add メソッドの利用例:
// 著者登録
$author = new Author();
$author->setName(“Ernest Miller Hemingway”);
// $author への作品登録
$article = new Article();
$article->setTitle(“The Old Man and the Sea”);
$author->addArticle($article);
// $autho への作品登録その2
$article = new Article();
$article->setTitle(“For Whom the Bell Tolls”);
$author->addArticle($article);
// 全て書き込み
$author->save();
結果:
Author:
id | name
1 | Ernest Miller Hemingway
Article:
id | name | author_id
1 | The Old Man and the Sea | 1
2 | For Whom the Bell Tolls | 1
参照例:
参照時には
参考:
–Relationships(propel.phpdb.org)