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