Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rufen Sie Daten aus der Verbindungstabelle in Yii2 ab

Kurz gesagt :Verwendung eines ActiveRecord für die von Ihnen vorgeschlagene Junction-Tabelle ist IMHO der richtige Weg, da Sie via() einrichten können um diesen vorhandenen ActiveRecord zu verwenden . Dadurch können Sie Yiis link() verwenden Methode, um Elemente in der Junction-Tabelle zu erstellen und gleichzeitig Daten (wie Ihr Admin-Flag) hinzuzufügen.

Der offizielle Yii Guide 2.0 gibt zwei Möglichkeiten an, eine Verbindungstabelle zu verwenden:die Verwendung von viaTable() und mit via() (Siehe hier ). Während Ersteres als Parameter den Namen der Junction-Tabelle erwartet, erwartet Letzteres als Parameter einen Relationennamen.

Wenn Sie Zugriff auf die Daten in der Verbindungstabelle benötigen, würde ich einen ActiveRecord verwenden für die Verbindungstabelle, wie Sie vorgeschlagen haben, und verwenden Sie 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']);
    }
}

Auf diese Weise können Sie die Daten der Junction-Tabelle ohne zusätzliche Abfragen über die userGroups abrufen Beziehung (wie bei jeder anderen 1:n-Beziehung):

$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

Dies alles kann mit hasMany erledigt werden Beziehung. Sie fragen sich vielleicht, warum Sie die Many-to-Many-Beziehung mit via() deklarieren sollten :Weil Sie Yiis link() verwenden können Methode zum Erstellen von Elementen in der Junction-Tabelle:

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