sql >> Database >  >> RDS >> Mysql

Haal gegevens op uit de knooppuntentabel in Yii2

Kortom :Een ActiveRecord gebruiken voor de verbindingstabel zoals je suggereerde is IMHO de juiste manier omdat je via() kunt instellen om dat bestaande ActiveRecord te gebruiken . Hiermee kun je Yii's link() . gebruiken methode om items in de verbindingstabel te maken terwijl u tegelijkertijd gegevens toevoegt (zoals uw beheerdersvlag).

De officiële Yii Guide 2.0 vermeldt twee manieren om een ​​verbindingstabel te gebruiken:met behulp van viaTable() en gebruik via() (zie hier ). Terwijl de eerste de naam van de verbindingstabel als parameter verwacht, verwacht de laatste een relatienaam als parameter.

Als je toegang nodig hebt tot de gegevens in de verbindingstabel, zou ik een ActiveRecord . gebruiken voor de verbindingstabel zoals je hebt voorgesteld en gebruik 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']);
    }
}

Op deze manier kunt u de gegevens van de verbindingstabel krijgen zonder aanvullende vragen met behulp van de userGroups relatie (zoals bij elke andere een-op-veel relatie):

$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

Dit kan allemaal met de hasMany relatie. U kunt zich dus afvragen waarom u de veel-op-veel-relatie moet aangeven met via() :Omdat je Yii's link() . kunt gebruiken methode om items in de verbindingstabel te maken:

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


  1. Hiërarchische tagging in SQL

  2. Laravel Welsprekende query JSON-kolom met Where In?

  3. Oracle-datumvergelijking verbroken vanwege DST

  4. Perl DBD::Oracle Module installatie