Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Ambil data dari tabel persimpangan di Yii2

Singkatnya :Menggunakan ActiveRecord untuk tabel persimpangan seperti yang Anda sarankan adalah IMHO cara yang benar karena Anda dapat mengatur via() untuk menggunakan ActiveRecord yang ada itu . Ini memungkinkan Anda untuk menggunakan link() Yi Yii metode untuk membuat item di tabel persimpangan sambil menambahkan data (seperti bendera admin Anda) secara bersamaan.

Panduan Yii 2.0 resmi menyatakan dua cara menggunakan tabel persimpangan:menggunakan viaTable() dan menggunakan via() (lihat di sini ). Sementara yang pertama mengharapkan nama tabel persimpangan sebagai parameter, yang terakhir mengharapkan nama relasi sebagai parameter.

Jika Anda memerlukan akses ke data di dalam tabel persimpangan, saya akan menggunakan ActiveRecord untuk tabel persimpangan seperti yang Anda sarankan dan gunakan 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']);
    }
}

Dengan cara ini Anda bisa mendapatkan data tabel persimpangan tanpa pertanyaan tambahan menggunakan userGroups relasi (seperti relasi satu-ke-banyak lainnya):

$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

Ini semua dapat dilakukan dengan menggunakan hasMany hubungan. Jadi, Anda mungkin bertanya mengapa Anda harus mendeklarasikan relasi banyak ke banyak menggunakan via() :Karena Anda dapat menggunakan link() Yi Yii metode untuk membuat item di tabel persimpangan:

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mengubah Kumpulan Karakter dari latin1 ke UTF8 di MySQL

  2. Masukkan beberapa email ke mysql menggunakan satu textarea

  3. MySQL pilih dengan kondisi CONCAT

  4. Dialek hibernasi untuk MySQL 8?

  5. java.net.SocketException:Pipa rusak