/** * Adds a RelationMap to the table * * @param string $name The relation name * @param string $tablePhpName The related table name * @param integer $type The relation type (either RelationMap::MANY_TO_ONE, RelationMap::ONE_TO_MANY, or RelationMAp::ONE_TO_ONE) * @param array $joinConditionMapping Arrays in array defining a normalize join condition [[':foreign_id', ':id', '='], [':foreign_type', 'value', '=']] * @param string $onDelete SQL behavior upon deletion ('SET NULL', 'CASCADE', ...) * @param string $onUpdate SQL behavior upon update ('SET NULL', 'CASCADE', ...) * @param string $pluralName Optional plural name for *_TO_MANY relationships * @param boolean $polymorphic Optional plural name for *_TO_MANY relationships * * @return RelationMap the built RelationMap object */ public function addRelation($name, $tablePhpName, $type, $joinConditionMapping = [], $onDelete = null, $onUpdate = null, $pluralName = null, $polymorphic = false) { // note: using phpName for the second table allows the use of DatabaseMap::getTableByPhpName() // and this method autoloads the TableMap if the table isn't loaded yet $relation = new RelationMap($name); $relation->setType($type); $relation->setOnUpdate($onUpdate); $relation->setOnDelete($onDelete); $relation->setPolymorphic($polymorphic); if (null !== $pluralName) { $relation->setPluralName($pluralName); } // set tables if (RelationMap::MANY_TO_ONE === $type) { $relation->setLocalTable($this); $relation->setForeignTable($this->dbMap->getTableByPhpName($tablePhpName)); } else { $relation->setLocalTable($this->dbMap->getTableByPhpName($tablePhpName)); $relation->setForeignTable($this); } // set columns foreach ($joinConditionMapping as $map) { list($local, $foreign) = $map; $relation->addColumnMapping($this->getColumnOrValue($local, $relation->getLocalTable()), $this->getColumnOrValue($foreign, $relation->getForeignTable())); } $this->relations[$name] = $relation; return $relation; }