Blog: Introducing Virtual Foreign Keys
Starting with version 1.6, Propel models can now share relationships even though the underlying tables aren't linked by a foreign key. This ability may be of great use when using Propel on top of a legacy database.
For example, a review
table designed for a MyISAM database engine is linked to a book
table by a simple book_id
column:
<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"/> </table>
To enable a model-only relationship, add a <foreign-key>
tag using the skipSql
attribute, as follows:
<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"/> <!-- Model-only relationship --> <foreign-key foreignTable="book" onDelete="CASCADE" skipSql="true"> <reference local="book_id" foreign="id"/> </foreign-key> </table>
Such a foreign key is not translated into SQL when Propel builds the table creation or table migration code. It can be seen as a "virtual foreign key". However, on the PHP side, the Book
model actually has a one-to-many relationship with the Review
model. The generated ActiveRecord and ActiveQuery classes take advantage of this relationship to offer smart getters and filters.