Kortom :Een ActiveRecord
gebruiken voor de verbindingstabel zoals je suggereerde is IMHO de juiste manier omdat je via()
kunt instellen om dat bestaande ActiveRecord
te gebruiken . Hiermee kun je Yii's link()
. gebruiken methode om items in de verbindingstabel te maken terwijl u tegelijkertijd gegevens toevoegt (zoals uw beheerdersvlag).
De officiële Yii Guide 2.0 vermeldt twee manieren om een verbindingstabel te gebruiken:met behulp van viaTable()
en gebruik via()
(zie hier
). Terwijl de eerste de naam van de verbindingstabel als parameter verwacht, verwacht de laatste een relatienaam als parameter.
Als je toegang nodig hebt tot de gegevens in de verbindingstabel, zou ik een ActiveRecord
. gebruiken voor de verbindingstabel zoals je hebt voorgesteld en gebruik 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']);
}
}
Op deze manier kunt u de gegevens van de verbindingstabel krijgen zonder aanvullende vragen met behulp van de userGroups
relatie (zoals bij elke andere een-op-veel relatie):
$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
Dit kan allemaal met de hasMany
relatie. U kunt zich dus afvragen waarom u de veel-op-veel-relatie moet aangeven met via()
:Omdat je Yii's link()
. kunt gebruiken methode om items in de verbindingstabel te maken:
$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())
}