Mysql
 sql >> Base de données >  >> RDS >> Mysql

Récupérer les données de la table de jonction dans Yii2

En bref :Utilisation d'un ActiveRecord pour la table de jonction comme vous l'avez suggéré, c'est à mon humble avis la bonne façon car vous pouvez configurer via() pour utiliser cet ActiveRecord existant . Cela vous permet d'utiliser le link() de Yii méthode pour créer des éléments dans la table de jonction tout en ajoutant des données (comme votre indicateur d'administrateur) en même temps.

Le guide Yii officiel 2.0 indique deux manières d'utiliser une table de jonction :en utilisant viaTable() et en utilisant via() (voir ici ). Alors que le premier attend le nom de la table de jonction en paramètre, le second attend un nom de relation en paramètre.

Si vous avez besoin d'accéder aux données à l'intérieur de la table de jonction, j'utiliserais un ActiveRecord pour la table de jonction comme vous l'avez suggéré et utilisez 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 cette façon, vous pouvez obtenir les données de la table de jonction sans requêtes supplémentaires en utilisant les userGroups relation (comme avec toute autre relation un-à-plusieurs):

$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

Tout cela peut être fait en utilisant le hasMany relation. Vous pouvez donc vous demander pourquoi vous devriez déclarer la relation plusieurs-à-plusieurs en utilisant via() :Parce que vous pouvez utiliser le link() de Yii méthode pour créer des éléments dans la table de jonction :

$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())
}