Tóm lại :Sử dụng ActiveRecord
đối với bảng nối như bạn đã đề xuất là IMHO đúng cách vì bạn có thể thiết lập via()
để sử dụng ActiveRecord
hiện có đó . Điều này cho phép bạn sử dụng link()
của Yii để tạo các mục trong bảng nối đồng thời thêm dữ liệu (như cờ quản trị của bạn).
Hướng dẫn Yii 2.0 chính thức nêu hai cách sử dụng bảng nối:sử dụng viaTable()
và sử dụng via()
(xem tại đây
). Trong khi cái trước mong đợi tên của bảng nối là tham số thì cái sau mong đợi một tên quan hệ là tham số.
Nếu bạn cần truy cập vào dữ liệu bên trong bảng nối, tôi sẽ sử dụng ActiveRecord
cho bảng nối như bạn đã đề xuất và sử dụng 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']);
}
}
Bằng cách này, bạn có thể lấy dữ liệu của bảng nối mà không cần truy vấn thêm bằng cách sử dụng userGroups
mối quan hệ (giống như với bất kỳ mối quan hệ một-nhiều nào khác):
$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
Tất cả điều này có thể được thực hiện bằng cách sử dụng hasMany
quan hệ. Vì vậy, bạn có thể hỏi tại sao bạn nên khai báo quan hệ nhiều-nhiều bằng cách sử dụng via()
:Vì bạn có thể sử dụng link()
của Yii phương pháp tạo các mục trong bảng nối:
$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())
}