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

Hent data fra krydstabel i Yii2

Kort sagt :Brug af en ActiveRecord for krydsningstabellen, som du foreslog, er IMHO den rigtige måde, fordi du kan konfigurere via() at bruge den eksisterende ActiveRecord . Dette giver dig mulighed for at bruge Yii's link() metode til at oprette elementer i junction-tabellen, mens du tilføjer data (som dit adminflag) på samme tid.

Den officielle Yii Guide 2.0 angiver to måder at bruge en forbindelsestabel på:ved at bruge viaTable() og ved at bruge via() (se her ). Mens førstnævnte forventer navnet på forbindelsestabellen som parameter, forventer sidstnævnte et relationsnavn som parameter.

Hvis du har brug for adgang til dataene i junction-tabellen, vil jeg bruge en ActiveRecord til junction-tabellen, som du foreslog, og brug 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å denne måde kan du få data fra junction-tabellen uden yderligere forespørgsler ved hjælp af userGroups relation (som med enhver anden en-til-mange relation):

$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

Alt dette kan gøres ved at bruge hasMany forhold. Så du kan spørge, hvorfor du skal erklære mange-til-mange-relationen ved hjælp af via() :Fordi du kan bruge Yii's link() metode til at oprette elementer i junction-tabellen:

$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. Hvordan laver jeg en masseindsættelse i mySQL ved hjælp af node.js

  2. Ekstremt grundlæggende PHP og Mysql

  3. Hvordan kan jeg kombinere to procedurer i én for at udfylde én tabel i stedet for at hver af de to procedurer udfylder sin egen tabel?

  4. Hvorfor forbinder min php-kode ikke til min eksterne MySql-database?