generateRelations() protected method

protected generateRelations ( ) : array
return array the generated relation declarations
Esempio n. 1
0
 protected function generateRelations()
 {
     $relations = parent::generateRelations();
     // inject namespace
     $ns = "\\{$this->ns}\\";
     foreach ($relations as $model => $relInfo) {
         foreach ($relInfo as $relName => $relData) {
             $relations[$model][$relName][0] = preg_replace('/(has[A-Za-z0-9]+\\()([a-zA-Z0-9]+::)/', '$1__NS__$2', $relations[$model][$relName][0]);
             $relations[$model][$relName][0] = str_replace('__NS__', $ns, $relations[$model][$relName][0]);
         }
     }
     return $relations;
 }
Esempio n. 2
0
 protected function generateRelations()
 {
     $relations = parent::generateRelations();
     // inject namespace
     $ns = "\\{$this->ns}\\";
     foreach ($relations as $model => $relInfo) {
         foreach ($relInfo as $relName => $relData) {
             // removed duplicated relations, eg. klientai, klientai0
             if ($this->removeDuplicateRelations && is_numeric(substr($relName, -1))) {
                 unset($relations[$model][$relName]);
                 continue;
             }
             $relations[$model][$relName][0] = preg_replace('/(has[A-Za-z0-9]+\\()([a-zA-Z0-9]+::)/', '$1__NS__$2', $relations[$model][$relName][0]);
             $relations[$model][$relName][0] = str_replace('__NS__', $ns, $relations[$model][$relName][0]);
         }
     }
     return $relations;
 }
Esempio n. 3
0
 /**
  * @inheritdoc
  */
 protected function generateRelations()
 {
     $relations = parent::generateRelations();
     // Set namespaces from base models to concrete models
     foreach ($relations as $className => &$rel) {
         foreach ($rel as $relClassName => &$relation) {
             $relation[0] = preg_replace('#\\(([^:]+)::className\\(\\)#', '(\\' . $this->getChildNs() . '\\\\$1::className()', $relation[0]);
             $relation[1] = '\\' . $this->getChildNs() . '\\' . $relation[1];
         }
     }
     return $relations;
 }
Esempio n. 4
0
 /**
  * @return array the generated relation declarations
  */
 public function generateRelations()
 {
     if (!$this->generateRelations) {
         return [];
     }
     $relations = parent::generateRelations();
     $definitions = ArrayHelper::getValue($relations, $this->tableName, []);
     // sanitaze all definitions
     foreach ($definitions as $key => $rules) {
         $fqn = helpers\BaseHelper::root($this->helperModel->getClass(ModelHelper::RK_MODEL_CM, $rules[1]));
         $sanitazed = $this->sanitazeRelationDefinition($rules, $fqn);
         $classAliases = ArrayHelper::getValue($this->relAliases, BaseHelper::basename($this->helperModel->getClass(ModelHelper::RK_MODEL_CM)));
         // if relation alias does not exists just replace origin definition with sanitazed
         if (!$classAliases || !isset($classAliases[$key])) {
             $relations[$this->tableName][$key][0] = $sanitazed;
             continue;
         }
         // duplicate relation definition
         $relations[$this->tableName][$classAliases[$key]] = $relations[$this->tableName][$key];
         // remove origin definition
         unset($relations[$this->tableName][$key]);
         // sanitaze relation alias
         $relations[$this->tableName][$classAliases[$key]][0] = $sanitazed;
     }
     if ($relations && isset($relations[$this->tableName])) {
         ksort($relations[$this->tableName]);
     }
     return $relations;
 }
Esempio n. 5
0
 /**
  * @inheritdoc
  */
 protected function generateRelations()
 {
     $db = $this->getDbConnection();
     $relations = [];
     $this->relationUses = [];
     $this->allRelations = [];
     $this->singularRelations = [];
     $this->pluralRelations = [];
     $generatedRelations = parent::generateRelations();
     foreach ($generatedRelations as $tableName => $tableRelations) {
         /* @var $tableSchema \yii\gii\plus\db\TableSchema */
         $tableSchema = $db->getTableSchema($tableName);
         $relations[$tableName] = [];
         $this->relationUses[$tableName] = [];
         $this->allRelations[$tableName] = [];
         $this->singularRelations[$tableName] = [];
         $this->pluralRelations[$tableName] = [];
         foreach ($tableRelations as $relationName => $relation) {
             list($code, $className, $hasMany) = $relation;
             /* @var $nsClassName string|\yii\boost\db\ActiveRecord */
             $nsClassName = Helper::getModelClassByTableName(array_search($className, $this->classNames));
             if ($nsClassName && class_exists($nsClassName)) {
                 $relations[$tableName][$relationName] = [$code, $className, $hasMany];
                 $this->relationUses[$tableName][] = $nsClassName;
                 // extended relations
                 $subTableSchema = $nsClassName::getTableSchema();
                 $subTableName = $subTableSchema->fullName;
                 // link
                 $link = [];
                 $direct = null;
                 if ($hasMany) {
                     foreach ($subTableSchema->foreignKeys as $foreignKey) {
                         if ($foreignKey[0] == $tableName) {
                             unset($foreignKey[0]);
                             $refs = $foreignKey;
                             if (strpos($code, $this->generateRelationLink($refs)) != false) {
                                 $link = $refs;
                                 $direct = false;
                                 break;
                             }
                         }
                     }
                 } else {
                     foreach ($tableSchema->foreignKeys as $foreignKey) {
                         if ($foreignKey[0] == $subTableName) {
                             unset($foreignKey[0]);
                             $refs = array_flip($foreignKey);
                             if (strpos($code, $this->generateRelationLink($refs)) != false) {
                                 $link = $refs;
                                 $direct = true;
                                 break;
                             }
                         }
                     }
                     if (!count($link)) {
                         foreach ($subTableSchema->foreignKeys as $foreignKey) {
                             if ($foreignKey[0] == $tableName) {
                                 unset($foreignKey[0]);
                                 $refs = $foreignKey;
                                 if (strpos($code, $this->generateRelationLink($refs)) != false) {
                                     $link = $refs;
                                     $direct = false;
                                     break;
                                 }
                             }
                         }
                     }
                 }
                 $viaTable = false;
                 if (preg_match('~\\-\\>viaTable\\(\'(\\w+)(?:\'| )~', $code, $match)) {
                     $viaTable = $match[1];
                 }
                 $linkCode = $this->generateRelationLink($link);
                 $this->allRelations[$tableName][$relationName] = compact('code', 'className', 'hasMany', 'nsClassName', 'link', 'direct', 'viaTable', 'linkCode');
                 if ($hasMany) {
                     $this->pluralRelations[$tableName][$relationName] = compact('code', 'className', 'hasMany', 'nsClassName', 'link', 'direct', 'viaTable', 'linkCode');
                 } else {
                     $this->singularRelations[$tableName][$relationName] = compact('code', 'className', 'hasMany', 'nsClassName', 'link', 'direct', 'viaTable', 'linkCode');
                 }
                 // via relations
                 if (!$hasMany && $subTableName != $tableName) {
                     foreach ($generatedRelations[$subTableName] as $subRelationName => $subRelation) {
                         list($subCode, $subClassName, $subHasMany) = $subRelation;
                         $tableName2 = array_search($subClassName, $this->classNames);
                         if ($tableName2 != $tableName) {
                             /* @var $subNsClassName string|\yii\boost\db\ActiveRecord */
                             $subNsClassName = Helper::getModelClassByTableName($tableName2);
                             if ($subNsClassName && class_exists($subNsClassName)) {
                                 if (!$subHasMany && !array_key_exists($subRelationName, $generatedRelations[$tableName])) {
                                     $viaLink = $this->generateRelationLink($link);
                                     $subCode = preg_replace('~;$~', "\n" . '            ->viaTable(\'' . $subTableName . ' via_' . $subTableName . '\', ' . $viaLink . ');', $subCode);
                                     if (!array_key_exists($subRelationName, $relations[$tableName]) || $direct) {
                                         $relations[$tableName][$subRelationName] = [$subCode, $subClassName, $subHasMany];
                                         $this->relationUses[$tableName][] = $subNsClassName;
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     $this->relationsDone = true;
     $this->classNames = [];
     return $this->fixRelations($relations);
 }
Esempio n. 6
0
 /**
  * @return array the generated relation declarations
  */
 protected function generateRelations()
 {
     if (!$this->generateRelations) {
         return [];
     }
     $relations = parent::generateRelations();
     $relationNames = [];
     // generate inverse relations
     $db = $this->getDbConnection();
     foreach ($this->getSchemaNames() as $schemaName) {
         foreach ($db->getSchema()->getTableSchemas($schemaName) as $table) {
             $className = $this->generateClassName($table->fullName);
             foreach ($table->foreignKeys as $refs) {
                 $refTable = $refs[0];
                 $refTableSchema = $db->getTableSchema($refTable);
                 unset($refs[0]);
                 $fks = array_keys($refs);
                 $leftRelationName = $this->generateRelationName($relationNames, $table, $fks[0], false);
                 $relationNames[$table->fullName][$leftRelationName] = true;
                 $hasMany = $this->isManyRelation($table, $fks);
                 $rightRelationName = $this->generateRelationName($relationNames, $refTableSchema, $className, $hasMany);
                 $relationNames[$refTableSchema->fullName][$rightRelationName] = true;
                 $relations[$table->fullName][$leftRelationName][0] = rtrim($relations[$table->fullName][$leftRelationName][0], ';') . "->inverseOf('" . lcfirst($rightRelationName) . "');";
                 $relations[$refTableSchema->fullName][$rightRelationName][0] = rtrim($relations[$refTableSchema->fullName][$rightRelationName][0], ';') . "->inverseOf('" . lcfirst($leftRelationName) . "');";
             }
         }
     }
     return $relations;
 }