Mysql
 sql >> Database >  >> RDS >> Mysql

Recupera i dati dalla tabella di giunzione in Yii2

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())
}