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())
}