Kurz gesagt :Verwendung eines ActiveRecord
für die von Ihnen vorgeschlagene Junction-Tabelle ist IMHO der richtige Weg, da Sie via()
einrichten können um diesen vorhandenen ActiveRecord
zu verwenden . Dadurch können Sie Yiis link()
verwenden Methode, um Elemente in der Junction-Tabelle zu erstellen und gleichzeitig Daten (wie Ihr Admin-Flag) hinzuzufügen.
Der offizielle Yii Guide 2.0 gibt zwei Möglichkeiten an, eine Verbindungstabelle zu verwenden:die Verwendung von viaTable()
und mit via()
(Siehe hier
). Während Ersteres als Parameter den Namen der Junction-Tabelle erwartet, erwartet Letzteres als Parameter einen Relationennamen.
Wenn Sie Zugriff auf die Daten in der Verbindungstabelle benötigen, würde ich einen ActiveRecord
verwenden für die Verbindungstabelle, wie Sie vorgeschlagen haben, und verwenden Sie 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']);
}
}
Auf diese Weise können Sie die Daten der Junction-Tabelle ohne zusätzliche Abfragen über die userGroups
abrufen Beziehung (wie bei jeder anderen 1:n-Beziehung):
$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
Dies alles kann mit hasMany
erledigt werden Beziehung. Sie fragen sich vielleicht, warum Sie die Many-to-Many-Beziehung mit via()
deklarieren sollten :Weil Sie Yiis link()
verwenden können Methode zum Erstellen von Elementen in der Junction-Tabelle:
$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())
}