W skrócie :Korzystanie z ActiveRecord
dla tabeli połączeń, jak zasugerowałeś, IMHO jest właściwą drogą, ponieważ możesz skonfigurować via()
aby użyć istniejącego ActiveRecord
. Pozwala to na użycie link()
Yii metoda tworzenia elementów w tabeli połączeń przy jednoczesnym dodawaniu danych (takich jak flaga administratora).
Oficjalny przewodnik po Yii 2.0 podaje dwa sposoby wykorzystania tablicy połączeń:użycie viaTable()
i używając via()
(zobacz tutaj
). Podczas gdy pierwsza oczekuje nazwy tabeli połączeń jako parametru, druga oczekuje nazwy relacji jako parametru.
Jeśli potrzebujesz dostępu do danych w tabeli połączeń, użyję ActiveRecord
dla tabeli połączeń zgodnie z sugestią i użyj 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']);
}
}
W ten sposób możesz uzyskać dane tabeli połączeń bez dodatkowych zapytań za pomocą userGroups
relacja (jak w przypadku każdej innej relacji jeden-do-wielu):
$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
To wszystko można zrobić za pomocą hasMany
relacja. Możesz więc zapytać, dlaczego powinieneś deklarować relację wiele-do-wielu za pomocą via()
:Ponieważ możesz użyć link()
Yii metoda tworzenia elementów w tabeli połączeń:
$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())
}