sql >> Base de Datos >  >> RDS >> Mysql

Recuperar datos de la tabla de unión en Yii2

En resumen :Usando un ActiveRecord para la tabla de unión como sugirió es en mi humilde opinión la forma correcta porque puede configurar via() para usar ese ActiveRecord existente . Esto te permite usar el link() de Yii método para crear elementos en la tabla de unión mientras agrega datos (como su indicador de administrador) al mismo tiempo.

La Guía oficial de Yii 2.0 establece dos formas de usar una tabla de unión:usando viaTable() y usando via() (ver aquí ). Mientras que el primero espera el nombre de la tabla de unión como parámetro, el último espera un nombre de relación como parámetro.

Si necesita acceder a los datos dentro de la tabla de unión, usaría un ActiveRecord para la tabla de unión como sugirió y use via() :

class User extends ActiveRecord
{
    public function getUserGroups() {
        // one-to-many
        return $this->hasMany(UserGroup::className(), ['user_id' => 'id']);
    }
}

class Group extends ActiveRecord
{
    public function getUserGroups() {
        // one-to-many
        return $this->hasMany(UserGroup::className(), ['group_id' => 'id']);
    }

    public function getUsers()
    {
        // many-to-many: uses userGroups relation above which uses an ActiveRecord class
        return $this->hasMany(User::className(), ['id' => 'user_id'])
            ->via('userGroups');
    }
}

class UserGroup extends ActiveRecord
{
    public function getUser() {
        // one-to-one
        return $this->hasOne(User::className(), ['id' => 'user_id']);
    }

    public function getGroup() {
        // one-to-one
        return $this->hasOne(Group::className(), ['id' => 'userh_id']);
    }
}

De esta manera, puede obtener los datos de la tabla de unión sin consultas adicionales utilizando los userGroups relación (como con cualquier otra relación de uno a muchos):

$group = Group::find()->where(['id' => $id])->with('userGroups.user')->one();
// --> 3 queries: find group, find user_group, find user
// $group->userGroups contains data of the junction table, for example:
$isAdmin = $group->userGroups[0]->adminFlag
// and the user is also fetched:
$userName = $group->userGroups[0]->user->name

Todo esto se puede hacer usando hasMany relación. Entonces puede preguntar por qué debería declarar la relación de muchos a muchos usando via() :Porque puedes usar el link() de Yii método para crear elementos en la tabla de unión:

$userGroup = new UserGroup();
// load data from form into $userGroup and validate
if ($userGroup->load(Yii::$app->request->post()) && $userGroup->validate()) {
    // all data in $userGroup is valid
    // --> create item in junction table incl. additional data
    $group->link('users', $user, $userGroup->getDirtyAttributes())
}