Kort sagt :Brug af en ActiveRecord
for krydsningstabellen, som du foreslog, er IMHO den rigtige måde, fordi du kan konfigurere via()
at bruge den eksisterende ActiveRecord
. Dette giver dig mulighed for at bruge Yii's link()
metode til at oprette elementer i junction-tabellen, mens du tilføjer data (som dit adminflag) på samme tid.
Den officielle Yii Guide 2.0 angiver to måder at bruge en forbindelsestabel på:ved at bruge viaTable()
og ved at bruge via()
(se her
). Mens førstnævnte forventer navnet på forbindelsestabellen som parameter, forventer sidstnævnte et relationsnavn som parameter.
Hvis du har brug for adgang til dataene i junction-tabellen, vil jeg bruge en ActiveRecord
til junction-tabellen, som du foreslog, og brug 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']);
}
}
På denne måde kan du få data fra junction-tabellen uden yderligere forespørgsler ved hjælp af userGroups
relation (som med enhver anden en-til-mange relation):
$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
Alt dette kan gøres ved at bruge hasMany
forhold. Så du kan spørge, hvorfor du skal erklære mange-til-mange-relationen ved hjælp af via()
:Fordi du kan bruge Yii's link()
metode til at oprette elementer i junction-tabellen:
$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())
}