sql >> データベース >  >> RDS >> Mysql

Yii2のジャンクションテーブルからデータを取得します

    要するにActiveRecordを使用する via()を設定できるので、あなたが提案したようなジャンクションテーブルの場合は正しい方法です。 その既存のActiveRecordを使用するには 。これにより、Yiiのlink()を使用できます データ(管理者フラグなど)を同時に追加しながら、junctionテーブルにアイテムを作成する方法。

    公式のYiiガイド2.0には、ジャンクションテーブルを使用する2つの方法が記載されています。viaTable()を使用する via()を使用する (こちら を参照してください。 )。前者はジャンクションテーブルの名前をパラメータとして期待しますが、後者はリレーション名をパラメータとして期待します。

    ジャンクションテーブル内のデータにアクセスする必要がある場合は、ActiveRecordを使用します 提案したジャンクションテーブルの場合は、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']);
        }
    }
    

    このようにして、userGroupsを使用して、追加のクエリなしでジャンクションテーブルのデータを取得できます。 関係(他の1対多の関係と同様):

    $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
    

    これはすべて、hasManyを使用して実行できます 関係。したがって、via()を使用して多対多の関係を宣言する必要がある理由を尋ねることができます。 :Yiiのlink()を使用できるため ジャンクションテーブルにアイテムを作成する方法:

    $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. MariaDBEnterpriseBackupとClusterControlBackupManagementの比較

    2. 初心者向けのSQLCOUNT()

    3. Selectステートメントのケース

    4. null値で列を更新する方法