基本的なリレーションシップ
Propelはデータベースが外部キーを使用してテーブル間の関係をサポートする方法を直接位置付けするオブジェクト間の関係をサポートします。Propelにおける関係のサポートはそれゆえ理解することは簡単ですが、このモデルのシンプルさもある程度継承します; 例えば、Propelは多対多の関係のためにクロスリファレンスのテーブルをしようしなければならないという事実を隠します(このトピックに関して詳細な情報はMany-to-Many Relationshipsページをご覧下さい)。
関係を定義する
リレーションシップはschema.xmlファイルの関連した<table>で外部キーを作成することで指定されます。データベースレベルで一つのテーブルを他のテーブルへの関連付けをするに当たって使用する同じ基本的な原則を使用して、一つのテーブルと他のテーブル間の関係を作る<foreign-key>タグを使用します。
<table name="book">
<column name="book_id" type="INTEGER" required="true" primaryKey="true"/>
<column name="title" type="VARCHAR" size="100" required="true"/>
<column name="author_id" type="INTEGER" required="true"/>
<foreign-key foreignTable="author">
<reference
local="author_id"
foreign="author_id"/>
</foreign-key>
</table>
<table name="author">
<column name="author_id" type="INTEGER" required="true" primaryKey="true"/>
<column name="fullname" type="VARCHAR" size="40" required="true"/>
</table>
Propelはこの情報を次のことに使用します: * DDLファイル(例えばschema.sql)でネイティブのFOREIGN KEY作成のSQLを生成し * 生成されたオブジェクトでゲッタとセッタメソッドを作成します(例えばBookはgetAuthor()メソッドとsetAuthor()メソッドを持ちます)
関連したオブジェクトを取得する
上記の例を使用することで(提供されたbookstoreスキーマに基づきます)、 指定された外部キーを使用するAuthorオブジェクトを返すBook->getAuthor()を持つことになります。
<?php $books = BookPeer::doSelect(new Criteria()); foreach($books as $book) { $author = $book->getAuthor(); }
上記のコードは1+nのSQL文の実行に終わります。nは本の数です(それゆえ、foreachループの繰り返し数です):
- 1 x SELECT * FROM book
- n x SELECT * FROM author WHERE author_id = $book->getAuthorId()
明確にこのメソッドが動作する一方で、それぞれの繰り返しのために2番目のクエリを実行することは最適ではありません。Propelはbookとauthorの情報を一つのクエリで取得する基本のpeerクラスでメソッドを生成します。
<?php $books = BookPeer::doSelectJoinAuthor(new Criteria()); foreach($books as $book) { $author = $book->getAuthor(); }
上記の場合、一つのクエリだけが実行されます:
- SELECT * FROM book INNER JOIN author ON author.author_id = book.author_id
より高度な関係トピックの扱いについてはMany-to-Many Relationshipsページをご覧下さい。
On-UpdateとOn-Deleteトリッガ
Propelは外部キーの観点からON UPDATEとON DELETEもサポートします。 onUpdateとonDelete属性を使用することでこれらのプロパティは<foreign-key>タグで指定することが出来ます。これらの属性のためにPropelは'CASCADE'、'SETNULL'、と'RESTRICT'の値をサポートします。ネイティブな外部キーをサポートをするデータベースのために、これらのトリッガーイベントは外部キーが作成されるときにデータベースレベルで指定されます。外部キーをサポートしないデータベースのために、この機能性はPropelによってエミュレートされます。
<table name="review">
<column name="review_id" type="INTEGER" primaryKey="true" required="true"/>
<column name="reviewer" type="VARCHAR" size="50" required="true"/>
<column name="book_id" required="true" type="INTEGER"/>
<foreign-key foreignTable="book" onDelete="CASCADE">
<reference local="book_id" foreign="book_id"/>
</foreign-key>
</table>
上記の例において、関連したbook列が削除された場合、review列が自動的に除去されます。
