/** * Return list of relations for current model * @return array */ public static function getRelations() { $old = parent::getRelations(); $old['parent'] = [DbRelations::BELONGS_TO, '\\mpf\\modules\\forum\\models\\ForumReplyThird', 'reply_id']; $old['replies'] = [DbRelations::HAS_MANY, '\\mpf\\modules\\forum\\models\\ForumReplyFifth', 'reply_id']; $old['myVote'] = DbRelation::hasOne(ForumReplyVote::className())->columnsEqual('id', 'reply_id')->hasValue('level', 4)->hasValue('user_id', WebApp::get()->user()->isConnected() ? WebApp::get()->user()->id : 0); return $old; }
protected function _columnsForRelation(DbRelation $relation, PDOConnection $connection, $relationName) { $sqlColumns = $connection->getTableColumns($relation->getTableName()); $columnAlias = str_replace('.', '_', str_replace('_', '__', $relationName)); $columns = []; foreach ($sqlColumns as $column) { $columns[] = "`{$relation->getTableAlias()}`.`{$column['Field']}` as ___{$columnAlias}___{$column['Field']}"; } return $columns; }
/** * @param $path * @param DbRelation $parentRelation * @return DbRelation */ protected function initSubRelation($path, DbRelation $parentRelation) { $modelClass = $parentRelation->model; $relations = $modelClass::getRelations(); $name = explode('.', $path); $name = $name[count($name) - 1]; $relation = $relations[$name]; if (is_array($relation)) { $details = $relation; $relationClass = $details[1]; switch ($details[0]) { case DbRelations::BELONGS_TO: $relation = DbRelation::belongsTo($details[1], $details[2]); break; case DbRelations::HAS_ONE: $relation = DbRelation::hasOne($details[1])->columnsEqual($modelClass::getDb()->getTablePk($modelClass::getTableName()), $details[2]); break; case DbRelations::HAS_MANY: $relation = DbRelation::hasMany($details[1])->columnsEqual($modelClass::getDb()->getTablePk($modelClass::getTableName()), $details[2]); break; case DbRelations::MANY_TO_MANY: //table_name(model_column, relation_column) list($tableName, $columns) = explode("(", $details[2]); $columns = explode(',', substr($columns, 0, strlen($columns) - 1)); $relation = DbRelation::manyToMany($details[1])->join([$tableName => $name . '_' . $tableName], [$modelClass::getDb()->getTablePk($modelClass::getTableName()) => trim($columns[0])])->columnsEqual($name . '_' . $tableName . '.' . trim($columns[1]), $relationClass::getDb()->getTablePk($relationClass::getTableName())); break; default: trigger_error("Invalid relation type {$details[0]}!"); } } return $relation; }
/** * Return list of relations for current model * @return array */ public static function getRelations() { return ['author' => [DbRelations::BELONGS_TO, '\\app\\models\\User', 'user_id'], 'thread' => [DbRelations::BELONGS_TO, '\\mpf\\modules\\forum\\models\\ForumThread', 'thread_id'], 'sectionAuthor' => DbRelation::belongsTo(ForumUser2Section::className(), 'user_id')->hasAttributeValue('section_id', 'currentSection'), 'editor' => [DbRelations::BELONGS_TO, '\\app\\models\\User', 'edit_user_id'], 'deletedBy' => [DbRelations::BELONGS_TO, '\\app\\models\\User', 'deleted_user_id'], 'authorGroup' => [DbRelations::BELONGS_TO, '\\mpf\\modules\\forum\\models\\ForumUserGroup', 'user_group_id'], 'replies' => [DbRelations::HAS_MANY, '\\mpf\\modules\\forum\\models\\ForumReplySecond', 'reply_id'], 'myVote' => DbRelation::hasOne(ForumReplyVote::className())->columnsEqual('id', 'reply_id')->hasValue('level', 1)->hasValue('user_id', WebApp::get()->user()->isConnected() ? WebApp::get()->user()->id : 0)]; }