symfony – propel でのリレーションの仕方

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)