In breve :Utilizzo di un ActiveRecord
per la tabella di giunzione come hai suggerito è IMHO nel modo giusto perché puoi impostare via()
per utilizzare quel ActiveRecord
esistente . Ciò ti consente di utilizzare link()
di Yii metodo per creare elementi nella tabella di giunzione aggiungendo dati (come il flag di amministratore) allo stesso tempo.
La Yii Guide 2.0 ufficiale indica due modi per usare una tabella di giunzione:usando viaTable()
e usando via()
(vedi qui
). Mentre il primo si aspetta il nome della tabella di giunzione come parametro, il secondo si aspetta un nome di relazione come parametro.
Se hai bisogno di accedere ai dati all'interno della tabella di giunzione userei un ActiveRecord
per la tabella di giunzione come hai suggerito e usa 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']);
}
}
In questo modo puoi ottenere i dati della tabella di giunzione senza ulteriori query utilizzando userGroups
relazione (come con qualsiasi altra relazione uno-a-molti):
$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
Tutto questo può essere fatto usando hasMany
relazione. Quindi potresti chiederti perché dovresti dichiarare la relazione molti-a-molti usando via()
:Perché puoi usare link()
di Yii metodo per creare elementi nella tabella di giunzione:
$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())
}