Kort sagt :Använder en ActiveRecord
för korsningstabellen som du föreslog är IMHO rätt sätt eftersom du kan ställa in via()
för att använda den befintliga ActiveRecord
. Detta låter dig använda Yiis link()
metod för att skapa objekt i korsningstabellen samtidigt som du lägger till data (som din adminflagga) samtidigt.
Den officiella Yii Guide 2.0 anger två sätt att använda en korsningstabell:med viaTable()
och använda via()
(se här
). Medan den förra förväntar sig namnet på korsningstabellen som parameter, förväntar sig den senare ett relationsnamn som parameter.
Om du behöver tillgång till data i junction-tabellen skulle jag använda en ActiveRecord
för korsningstabellen som du föreslog och använd 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å så sätt kan du få data från kopplingstabellen utan ytterligare frågor med hjälp av userGroups
relation (som med alla andra en-till-många-relationer):
$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
Allt detta kan göras med hjälp av hasMany
relation. Så du kan fråga varför du ska deklarera många-till-många-relationen med via()
:Eftersom du kan använda Yiis link()
metod för att skapa objekt i korsningstabellen:
$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())
}