protected generateRelations ( ) : array | ||
return | array | the generated relation declarations |
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; }
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; }
/** * @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; }
/** * @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; }
/** * @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); }
/** * @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; }