diff options
author | wei <> | 2007-10-08 03:24:07 +0000 |
---|---|---|
committer | wei <> | 2007-10-08 03:24:07 +0000 |
commit | 4ceba82b9863f2c6323cbe00407e4bfbedbfc1cd (patch) | |
tree | bc93498b5bf77b25c5a2d5a87ffaa4f8a9b70728 /demos | |
parent | aedbfe04daaaa0baa8e97c4d7d13e8a1f9d867cb (diff) |
Allow active records to have multiple foreign key references to the same table. Add TXCache.
Diffstat (limited to 'demos')
-rw-r--r-- | demos/northwind-db/protected/database/Employee.php | 2 | ||||
-rw-r--r-- | demos/quickstart/protected/pages/Database/ActiveRecord.page | 52 | ||||
-rw-r--r-- | demos/quickstart/protected/pages/Database/ar_objects.png | bin | 19837 -> 20638 bytes | |||
-rw-r--r-- | demos/quickstart/protected/pages/Database/ar_objects.vsd | bin | 190976 -> 190976 bytes | |||
-rw-r--r-- | demos/quickstart/protected/pages/Database/id/ActiveRecord.page | 8 |
5 files changed, 45 insertions, 17 deletions
diff --git a/demos/northwind-db/protected/database/Employee.php b/demos/northwind-db/protected/database/Employee.php index 92de3f24..1e0f090e 100644 --- a/demos/northwind-db/protected/database/Employee.php +++ b/demos/northwind-db/protected/database/Employee.php @@ -32,7 +32,7 @@ class Employee extends TActiveRecord public static $RELATIONS = array
(
- 'Territories' => array(self::HAS_MANY, 'Territory', 'EmployeeTerritories'),
+ 'Territories' => array(self::MANY_TO_MANY, 'Territory', 'EmployeeTerritories'),
'Orders' => array(self::HAS_MANY, 'Order'),
//parent children relationship
diff --git a/demos/quickstart/protected/pages/Database/ActiveRecord.page b/demos/quickstart/protected/pages/Database/ActiveRecord.page index a6e087b9..cb10d184 100644 --- a/demos/quickstart/protected/pages/Database/ActiveRecord.page +++ b/demos/quickstart/protected/pages/Database/ActiveRecord.page @@ -657,10 +657,30 @@ in Active Record by inspecting the <tt>Players</tt> and <tt>Teams</tt> table def </p> <div class="info"><b class="note">Info:</b> -Active Record supports multiple table foreign key relationships with the restriction -that each relationship corresponds to a unique table. For example, the <tt>Players</tt> -table may only have one set of foreign key relationship with table <tt>Teams</tt>, it may -have other relationships that corresponds to other tables (including the <tt>Players</tt> table itself). +Since version <b>3.1.2</b>, Active Record supports multiple foreign key +references of the same table. Ambiguity between multiple foreign key references to the same table is +resolved by providing the foreign key column name as the 3rd parameter in the relationship array. +For example, both the following foreign keys <tt>owner_id</tt> and <tt>reporter_id</tt> +references the same table defined in <tt>UserRecord</tt>. +<com:TTextHighlighter Language="php" CssClass="source block-content"> +class TicketRecord extends TActiveRecord +{ + public $owner_id; + public $reporter_id; + + public $owner; + public $reporter; + + public static $RELATION=array + ( + 'owner' => array(self::BELONGS_TO, 'UserRecord', 'owner_id'), + 'reporter' => array(self::BELONGS_TO, 'UserRecord', 'reporter_id'), + ); +} +</com:TTextHighlighter> +This is applicable to relationships including <tt>BELONGS_TO</tt>, <tt>HAS_ONE</tt> and +<tt>HAS_MANY</tt>. See section <a href="#142021">Self Referenced Association Tables</a> for solving ambiguity of <tt>MANY_TO_MANY</tt> +relationships. </div> <p id="710023" class="block-content">The "has many" relationship is not fetched automatically when you use any of the Active Record finder methods. @@ -713,7 +733,7 @@ class PlayerRecord extends TActiveRecord public static $RELATIONS=array ( 'team' => array(self::BELONGS_TO, 'TeamRecord'), - 'skills' => array(self::HAS_MANY, 'SkillRecord', 'Player_Skills'), + 'skills' => array(self::MANY_TO_MANY, 'SkillRecord', 'Player_Skills'), 'profile' => array(self::HAS_ONE, 'ProfileRecord'), ); @@ -850,9 +870,9 @@ in the <tt>Player_Skills</tt> association table using an inner join. </p> <p id="710035" class="block-content">The Prado Active Record design implements the two stage approach. For the -<tt>Players</tt>-<tt>Skills</tt> M-N (many-to-many) entity relationship, we need -to define a <b>has many</b> relationship in the <tt>PlayerRecord</tt> class and -in addition define a <b>has many</b> relationship in the <tt>SkillRecord</tt> class as well. +<tt>Players</tt>-<tt>Skills</tt> M-N (many-to-many) entity relationship, we +define a <b>many-to-many</b> relationship in the <tt>PlayerRecord</tt> class and +in addition we may define a <b>many-to-many</b> relationship in the <tt>SkillRecord</tt> class as well. The following sample code defines the complete <tt>SkillRecord</tt> class with a many-to-many relationship with the <tt>PlayerRecord</tt> class. (See the <tt>PlayerRecord</tt> class definition above to the corresponding many-to-many relationship with the <tt>SkillRecord</tt> class.) @@ -869,7 +889,7 @@ class SkillRecord extends TActiveRecord public static $RELATIONS=array ( - 'players' => array(self::HAS_MANY, 'PlayerRecord', 'Player_Skills'), + 'players' => array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills'), ); public static function finder($className=__CLASS__) @@ -882,12 +902,20 @@ class SkillRecord extends TActiveRecord <p id="710036" class="block-content"> The static <tt>$RELATIONS</tt> property of SkillRecord defines that the property <tt>$players</tt> has many <tt>PlayerRecord</tt>s via an association table '<tt>Player_Skills</tt>'. -In <tt>array(self::HAS_MANY, 'PlayerRecord', 'Player_Skills')</tt>, the first element defines the -relationship type, in this case <strong><tt>self::HAS_MANY</tt></strong>, +In <tt>array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills')</tt>, the first element defines the +relationship type, in this case <strong><tt>self::MANY_TO_MANY</tt></strong>, the second element is a string <tt>'PlayerRecord'</tt> that corresponds to the class name of the <tt>PlayerRecord</tt> class, and the third element is the name of the association table name. </p> + +<div class="note"><b class="note">Note:</b> +Prior to version <b>3.1.2</b> (versions up to 3.1.1), the many-to-many relationship was +defined using <tt>self::HAS_MANY</tt>. For version <b>3.1.2</b> onwards, this must be changed +to <tt>self::MANY_TO_MANY</tt>. This can be done by searching for the <tt>HAS_MANY</tt> in your +source code and carfully changing the appropriate definitions. +</div> + <p id="710037" class="block-content"> A list of player objects with the corresponding collection of skill objects may be fetched as follows. </p> @@ -951,7 +979,7 @@ class Item extends TActiveRecord public static $RELATIONS=array ( - 'related_items' => array(self::HAS_MANY, + 'related_items' => array(self::MANY_TO_MANY, 'Item', 'related_items.related_item_id'), ); } diff --git a/demos/quickstart/protected/pages/Database/ar_objects.png b/demos/quickstart/protected/pages/Database/ar_objects.png Binary files differindex 50ab812d..ac33b88b 100644 --- a/demos/quickstart/protected/pages/Database/ar_objects.png +++ b/demos/quickstart/protected/pages/Database/ar_objects.png diff --git a/demos/quickstart/protected/pages/Database/ar_objects.vsd b/demos/quickstart/protected/pages/Database/ar_objects.vsd Binary files differindex 10346c54..d3b3963d 100644 --- a/demos/quickstart/protected/pages/Database/ar_objects.vsd +++ b/demos/quickstart/protected/pages/Database/ar_objects.vsd diff --git a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page index b7b9e612..7273640d 100644 --- a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page +++ b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page @@ -615,7 +615,7 @@ class PlayerRecord extends TActiveRecord public static $RELATIONS=array ( 'team' => array(self::BELONGS_TO, 'TeamRecord'), - 'skills' => array(self::HAS_MANY, 'SkillRecord', 'Player_Skills'), + 'skills' => array(self::MANY_TO_MANY, 'SkillRecord', 'Player_Skills'), 'profile' => array(self::HAS_ONE, 'ProfileRecord'), ); @@ -737,7 +737,7 @@ class SkillRecord extends TActiveRecord public static $RELATIONS=array ( - 'players' => array(self::HAS_MANY, 'PlayerRecord', 'Player_Skills'), + 'players' => array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills'), ); public static function finder($className=__CLASS__) @@ -749,7 +749,7 @@ class SkillRecord extends TActiveRecord <p id="710036" class="block-content"> Properti statis <tt>$RELATIONS</tt> dari SkillRecord mendefinisikan bahwa properti <tt>$players</tt> memiliki banyak <tt>PlayerRecord</tt>s melalui tabel asosiasi '<tt>Player_Skills</tt>'. -Dalam <tt>array(self::HAS_MANY, 'PlayerRecord', 'Player_Skills')</tt>, elemen pertama mendefinisikan tipe hubungan, dalam hal ini <strong><tt>self::HAS_MANY</tt></strong>, +Dalam <tt>array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills')</tt>, elemen pertama mendefinisikan tipe hubungan, dalam hal ini <strong><tt>self::HAS_MANY</tt></strong>, elemen kedua adalah string <tt>'PlayerRecord'</tt> yang terkait ke nama kelas dari kelas <tt>PlayerRecord</tt>, dan elemen ketiga adalah nama dari nama tabel asosiasi. </p> <p id="710037" class="block-content"> @@ -805,7 +805,7 @@ class Item extends TActiveRecord public static $RELATIONS=array ( - 'related_items' => array(self::HAS_MANY, + 'related_items' => array(self::MANY_TO_MANY, 'Item', 'related_items.related_item_id'), ); } |