protected function addRefFkAddCriteriaById(&$script, ForeignKey $refFk) { $foreignPeerBuilder = self::getNewPeerBuilder($refFk->getTable()); $args = array(); $adds = array(); foreach ($refFk->getLocalForeignMapping() as $localName => $foreignName) { $args[] = "\${$foreignName}"; $adds[] = <<<adds \$criteria->add({$foreignPeerBuilder->getColumnConstant($refFk->getTable()->getColumn($localName))}, \${$foreignName}); adds; } $args = implode(', ', $args); $adds = implode("\n", $adds); $script .= <<<script public static function add{$this->getRefFkPhpNameAffix($refFk, true)}CriteriaById(Criteria \$criteria, {$args}) { {$adds} return \$criteria; } script; }
protected static function getRefRelatedBySuffix(ForeignKey $fk) { $relCol = ''; foreach ($fk->getLocalForeignMapping() as $localColumnName => $foreignColumnName) { $localTable = $fk->getTable(); $localColumn = $localTable->getColumn($localColumnName); if (!$localColumn) { throw new Exception("Could not fetch column: {$columnName} in table " . $localTable->getName()); } $foreignKeysToForeignTable = $localTable->getForeignKeysReferencingTable($fk->getForeignTableName()); if ($fk->getForeignTableName() == $fk->getTableName()) { // self referential foreign key $relCol .= $fk->getForeignTable()->getColumn($foreignColumnName)->getPhpName(); if (count($foreignKeysToForeignTable) > 1) { // several self-referential foreign keys $relCol .= array_search($fk, $foreignKeysToForeignTable); } } elseif (count($foreignKeysToForeignTable) > 1 || count($fk->getForeignTable()->getForeignKeysReferencingTable($fk->getTableName())) > 0) { // several foreign keys to the same table, or symmetrical foreign key in foreign table $relCol .= $localColumn->getPhpName(); } } if ($relCol != '') { $relCol = 'RelatedBy' . $relCol; } return $relCol; }
/** * Gets the "RelatedBy*" suffix (if needed) that is attached to method and variable names. * * The related by suffix is based on the local columns of the foreign key. If there is more than * one column in a table that points to the same foreign table, then a 'RelatedByLocalColName' suffix * will be appended. * * @return string */ protected static function getRelatedBySuffix(ForeignKey $fk, $reverseOnSelf = false) { $relCol = ''; foreach ($fk->getLocalForeignMapping() as $columnName => $foreignColumnName) { $column = $fk->getTable()->getColumn($columnName); if (!$column) { throw new Exception("Could not fetch column: {$columnName} in table " . $fk->getTable()->getName()); } if (count($column->getTable()->getForeignKeysReferencingTable($fk->getForeignTableName())) > 1) { // if there are several foreign keys that point to the same table // then we need to generate methods like getAuthorRelatedByColName() // instead of just getAuthor(). $relCol .= $column->getPhpName(); } elseif ($fk->getForeignTableName() == $fk->getTable()->getName()) { // self referential foreign key if ($reverseOnSelf) { $relCol .= $column->getPhpName(); } else { $relCol .= $fk->getTable()->getColumn($foreignColumnName)->getPhpName(); } } } if ($relCol != '') { $relCol = 'RelatedBy' . $relCol; } return $relCol; }