Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lấy dữ liệu từ bảng nối trong Yii2

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn tìm kiếm nhiều thẻ

  2. Tập lệnh tạo người dùng Mysql

  3. Đính kèm cơ sở dữ liệu hiện có với MySQL

  4. Thao tác dữ liệu utf8mb4 từ MySQL với PHP

  5. pyodbc + MySQL + Windows:Không tìm thấy tên nguồn dữ liệu và không có trình điều khiển mặc định nào được chỉ định