- Home
- About
- Testimonials
- Demos
- Download
- Documentation
- Blogs
- Forum
- Support

Packages:
default
System
System.Caching
System.Collections
System.Data
System.Data.ActiveRecord
System.Data.ActiveRecord.Relations
System.Data.ActiveRecord.Scaffold
System.Data.ActiveReecord.Scaffold.InputBuilder
System.Data.Commom.Sqlite
System.Data.Common
System.Data.Common.Mssql
System.Data.Common.Mysql
System.Data.Common.Oracle
System.Data.Common.Pgsql
System.Data.Common.Sqlite
System.Data.DataGateway
System.Data.SqlMap
System.Data.SqlMap.Configuration
System.Data.SqlMap.Statements
System.Exceptions
System.I18N
System.IO
System.Security
System.Util
System.Web
System.Web.Services
System.Web.UI
System.Web.UI.ActiveControls
System.Web.UI.WebControls
System.Web.UI.WebControls.assets
System.Xml
Classes:
TActiveRecordBelongsTo
TActiveRecordHasMany
TActiveRecordHasManyAssociation
TActiveRecordHasOne
TActiveRecordRelation
TActiveRecordRelationContext

Keyword

# Class TActiveRecordHasManyAssociation

    TActiveRecordRelation
       |
       --TActiveRecordHasManyAssociation

Implements the M-N (many to many) relationship via association table.

Consider the entity relationship between Articles and Categories via the association table <tt>Article_Category</tt>.

     +---------+            +------------------+            +----------+
     | Article | * -----> * | Article_Category | * <----- * | Category |
     +---------+            +------------------+            +----------+

Where one article may have 0 or more categories and each category may have 0 or more articles. We may model Article-Category object relationship as active record as follows.

     class ArticleRecord
     {
         const TABLE='Article';
         public $article_id;

         public $Categories=array(); //foreign object collection.

         public static $RELATIONS = array
         (
             'Categories' => array(self::MANY_TO_MANY, 'CategoryRecord', 'Article_Category')
         );

         public static function finder($className=__CLASS__)
         {
             return parent::finder($className);
         }
     }
     class CategoryRecord
     {
         const TABLE='Category';
         public $category_id;

         public $Articles=array();

         public static $RELATIONS = array
         (
             'Articles' => array(self::MANY_TO_MANY, 'ArticleRecord', 'Article_Category')
         );

         public static function finder($className=__CLASS__)
         {
             return parent::finder($className);
         }
     }

The static <tt>$RELATIONS</tt> property of ArticleRecord defines that the property <tt>$Categories</tt> has many <tt>CategoryRecord</tt>s. Similar, the static <tt>$RELATIONS</tt> property of CategoryRecord defines many ArticleRecords.

The articles with categories list may be fetched as follows.

     $articles = TeamRecord::finder()->withCategories()->findAll();

The method <tt>with_xxx()</tt> (where <tt>xxx</tt> is the relationship property name, in this case, <tt>Categories</tt>) fetchs the corresponding CategoryRecords using a second query (not by using a join). The <tt>with_xxx()</tt> accepts the same arguments as other finder methods of TActiveRecord.
Since: 3.1
Author: Wei Zhuo <weizho[at]gmail[dot]com>

Method Summary
protected void | collectForeignObjects ( array &$results) Get the foreign key index values from the results and make calls to the database to find the corresponding foreign objects using association table.
void | createCommand ( TSqlCriteria $criteria, TTableInfo $foreignKeys, array $indexValues, array $sourceKeys)
protected TActiveRecord | createFkObject ( string $type, array $row, array $foreignKeys)
protected void | fetchForeignObjects ( array &$results, array $foreignKeys, mixed $indexValues, mixed $sourceKeys) Fetches the foreign objects using TActiveRecord::findAllByIndex()
protected string | getAssociationJoin ( array $foreignKeys, array $indexValues, array $sourceKeys) SQL inner join for M-N relationship via association table.
protected TDbTableInfo | getAssociationTable ()
protected TDbCommandBuilder | getAssociationTableCommandBuilder ()
protected TDataGatewayCommand | getCommandBuilder ()
protected TDataGatewayCommand | getForeignCommandBuilder ()
protected TDbTableInfo | getForeignTable ()
array | getRelationForeignKeys ()
protected string | getSourceColumns ( array $sourceKeys)
protected TDbTableInfo | getSourceTable ()
boolean | updateAssociatedRecords () Updates the associated foreign objects.

Methods Inherited From TActiveRecordRelation

TActiveRecordRelation::fetchResultsInto(), TActiveRecordRelation::findForeignKeys(), TActiveRecordRelation::findForeignObjects(), TActiveRecordRelation::getContext(), TActiveRecordRelation::getCriteria(), TActiveRecordRelation::getIndexValues(), TActiveRecordRelation::getObjectHash(), TActiveRecordRelation::getSourceRecord(), TActiveRecordRelation::populateResult(), TActiveRecordRelation::setObjectProperty(), TActiveRecordRelation::setResultCollection(), TActiveRecordRelation::__call()

Method Details

## collectForeignObjects

protected void collectForeignObjects | (array &$results )

Get the foreign key index values from the results and make calls to the database to find the corresponding foreign objects using association table.

Input
array | &$results | original results.
Output
Exception

## createCommand

public void createCommand | (TSqlCriteria $criteria , TTableInfo $foreignKeys , array $indexValues , array $sourceKeys )

Input
TSqlCriteria | $criteria |
TTableInfo | $foreignKeys | association table info
array | $indexValues | field names
array | $sourceKeys | field values
Output
Exception

## createFkObject

protected TActiveRecord createFkObject | (string $type , array $row , array $foreignKeys )

Input
string | $type | active record class name.
array | $row | row data
array | $foreignKeys | foreign key column names
Output
Exception

## fetchForeignObjects

protected void fetchForeignObjects | (array &$results , array $foreignKeys , mixed $indexValues , mixed $sourceKeys )

Fetches the foreign objects using TActiveRecord::findAllByIndex()

Input
array | &$results | field names
array | $foreignKeys | foreign key index values.
mixed | $indexValues |
mixed | $sourceKeys |
Output
Exception

## getAssociationJoin

protected string getAssociationJoin | (array $foreignKeys , array $indexValues , array $sourceKeys )

SQL inner join for M-N relationship via association table.

Input
array | $foreignKeys | foreign table column key names.
array | $indexValues | source table index values.
array | $sourceKeys | source table column names.
Output
string | inner join condition for M-N relationship via association table.
Exception

## getAssociationTable

protected TDbTableInfo getAssociationTable | ()

Output
TDbTableInfo | association table information.
Exception

## getAssociationTableCommandBuilder

protected TDbCommandBuilder getAssociationTableCommandBuilder | ()

Output
Exception

## getCommandBuilder

protected TDataGatewayCommand getCommandBuilder | ()

Output
Exception

## getForeignCommandBuilder

protected TDataGatewayCommand getForeignCommandBuilder | ()

Output
Exception

## getForeignTable

protected TDbTableInfo getForeignTable | ()

Output
TDbTableInfo | foreign table information.
Exception

## getRelationForeignKeys

public array getRelationForeignKeys | ()

Output
array | 2 arrays of source keys and foreign keys from the association table.
Exception

## getSourceColumns

protected string getSourceColumns | (array $sourceKeys )

Input
array | $sourceKeys | source table column names.
Output
string | comma separated source column names.
Exception

## getSourceTable

protected TDbTableInfo getSourceTable | ()

Output
TDbTableInfo | source table information.
Exception

## updateAssociatedRecords

public boolean updateAssociatedRecords | ()

Updates the associated foreign objects.

Output
boolean | true if all update are success (including if no update was required), false otherwise .
Exception