sql >> Databasteknik >  >> RDS >> Mysql

Hämta data från korsningstabellen i Yii2

Kort sagt :Använder en ActiveRecord för korsningstabellen som du föreslog är IMHO rätt sätt eftersom du kan ställa in via() för att använda den befintliga ActiveRecord . Detta låter dig använda Yiis link() metod för att skapa objekt i korsningstabellen samtidigt som du lägger till data (som din adminflagga) samtidigt.

Den officiella Yii Guide 2.0 anger två sätt att använda en korsningstabell:med viaTable() och använda via() (se här ). Medan den förra förväntar sig namnet på korsningstabellen som parameter, förväntar sig den senare ett relationsnamn som parameter.

Om du behöver tillgång till data i junction-tabellen skulle jag använda en ActiveRecord för korsningstabellen som du föreslog och använd 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å så sätt kan du få data från kopplingstabellen utan ytterligare frågor med hjälp av userGroups relation (som med alla andra en-till-många-relationer):

$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

Allt detta kan göras med hjälp av hasMany relation. Så du kan fråga varför du ska deklarera många-till-många-relationen med via() :Eftersom du kan använda Yiis link() metod för att skapa objekt i korsningstabellen:

$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. Hur kan jag skapa en kopia av en Oracle-tabell utan att kopiera data?

  2. Hur man ökar maximala anslutningar i PostgreSQL

  3. MySQL:jämförelse av heltalsvärde och strängfält med index

  4. MySQL-frågor