sql >> Databáze >  >> RDS >> Mysql

Načtěte data z tabulky spojení v Yii2

Ve zkratce :Pomocí ActiveRecord protože spojovací tabulka, jak jste navrhl, je IMHO správný způsob, protože můžete nastavit via() použít stávající ActiveRecord . To vám umožní používat Yii's link() způsob vytváření položek ve spojovací tabulce a současné přidávání dat (jako je váš příznak správce).

Oficiální Yii Guide 2.0 uvádí dva způsoby použití spojovací tabulky:pomocí viaTable() a pomocí via() (viz zde ). Zatímco první očekává název tabulky spojení jako parametr, druhý očekává název vztahu jako parametr.

Pokud potřebujete přístup k datům uvnitř spojovací tabulky, použil bych ActiveRecord pro spojovací tabulku, jak jste navrhli, a použijte 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']);
    }
}

Tímto způsobem můžete získat data spojovací tabulky bez dalších dotazů pomocí userGroups vztah (jako u jakéhokoli jiného vztahu jeden k mnoha):

$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

To vše lze provést pomocí hasMany vztah. Můžete se tedy zeptat, proč byste měli deklarovat vztah many-to-many pomocí via() :Protože můžete použít Yiiho link() metoda k vytvoření položek ve spojovací tabulce:

$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. Jaký je rozdíl mezi použitím křížového spojení a vložením čárky mezi dvě tabulky?

  2. Jak mohu použít uživatelem definovanou proměnnou MySql v .NET MySqlCommand?

  3. Jak na to:Vyčistit mysql úložiště InnoDB?

  4. Jak použít trigger v MySql k vytvoření cizího klíče