2016-02-25 14 views
8

Tôi đang cố gắng liệt kê một số dữ liệu qua tiện ích Kartik GridView trong yii2 bằng cách sử dụng các mối quan hệ. tôi có các bảngTHAM GIA nhiều bảng sử dụng các mối quan hệ trong Yii2

staffs 

CREATE TABLE IF NOT EXISTS `staffs` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(250) CHARACTER SET utf8 DEFAULT NULL, 
    `department_id` int(11) DEFAULT NULL, 
    `designation_id` int(11) DEFAULT NULL, 
    `username` varchar(50) CHARACTER SET utf8 DEFAULT NULL, 
    `emailid` varchar(250) CHARACTER SET utf8 DEFAULT NULL, 
    `staffrights` tinyint(2) DEFAULT '0', 
    `staffstatus` tinyint(2) DEFAULT '1', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
designations 

CREATE TABLE IF NOT EXISTS `designations` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `designname` varchar(150) NOT NULL, 
    `designation_group_id` varchar(250) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 



designation_group 


CREATE TABLE IF NOT EXISTS `designation_group` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `group_name` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

designations bảng có liên quan đến designation_group bởi designations.designation_group_id. designations bảng sẽ có một hoặc nhiều giá trị được phân tách bằng dấu phẩy, của designation_group.id.

designations bảng liên quan đến bảng nhân viên theo số staffs.designation_id =designations.id. Trong Staffs mẫu tôi đã thêm các mối quan hệ như thế này

public function getDesignations() { 
     return $this->hasOne(Designations::className(), ['id' => 'designation_id']); 
    } 

và đang làm việc hoàn hảo. Nhưng mối quan hệ cho designation_group Tôi đã thử như sau:

public function getDesgroupstaffs(){ 
     return $this->hasOne(Designations::className() , ['id' => 'id']) 
        ->from(Designationgroup::tableName()) ; 
} 

Nhưng nó không cho kết quả mong đợi. Bạn có thể tham gia bảng designation_group sao cho tất cả nhóm chỉ định được liên kết với nhân viên cũng có thể được hiển thị? Tôi muốn hiển thị như, cột đầu tiên của chế độ xem lưới sẽ là chỉ định, trong khi bộ lọc của cùng một cột nên là DesignationGroup.group_name. SO nếu bất kỳ group_name nào được chọn, nó sẽ hiển thị dữ liệu của các nhân viên liên quan đến tên nhóm đó

+0

sử dụng yii2 joinWidth như ... 'Mẫu :: tìm() -> joinWith ([ 'Quan hệ Tên']) -> tất cả();' tham khảo liên kết này [Tham gia với quan hệ] (http://www.yiiframework.com/doc-2.0/guide-db-active-record.html) – vishuB

+0

Mối quan hệ không Desgroupstaffs cung cấp cho nhóm chỉ định – user7282

+0

mối quan hệ này là sai '[ 'id' => 'id'] 'trong' getDesgroupstaffs() 'hàm – vishuB

Trả lời

-1

Tôi sẽ đề nghị bạn xóa cột designation_group_id khỏi bảng chỉ định, vì nó chứa nhiều giá trị được phân tách bằng dấu phẩy. Tạo một bảng nhiều tên designation_group_assigned, mà sẽ có các cột sau: Id, designation_id, designation_group_id

Trong bảng này, chúng ta có thể chèn nhiều hàng nếu một định thuộc về nhiều nhóm.

Và sau đó bạn có thể sử dụng các mối quan hệ yii cho một đến nhiều bản ghi.

2

Vâng, từ những gì tôi có thể trích xuất từ ​​câu hỏi của bạn, bạn muốn có thể lấy tên nhóm cho từng nhân viên. Mã dưới đây sẽ giúp bạn hoàn thành nhiệm vụ đó.

Bên trong mô hình nhân viên, tạo ra một mối quan hệ như nêu dưới đây hoặc bạn có thể sử dụng một trong hiện tại mà tôi chắc chắn Yii sẽ tự động tạo ra nó cho bạn

mô hình NHÂN

public function getDesignation() 
{ 
    return $this->hasOne(Designation::className(),['designation_id'=>'id]); 
} 

Bên trong mô hình chỉ định, tạo một mối quan hệ khác liên kết mô hình thoái hóa với mô hình designationGroup, mà sẽ được tự động tạo ra cũng như

Chỉ MODEL

public function getDesignationGroup() 
{ 
    return $this->hasOne(DesignationGroup::className(),['id'=>'designation_group_id]); 
} 

Cuối cùng, trên GridView, bạn có thể sử dụng mã dưới đây để có được tên nhóm

$model->destination->designationGroup->group_name 

Tôi hy vọng điều này giải quyết vấn đề của bạn. Mặc dù tôi đã sử dụng nó vài lần.

+1

Bộ lọc trong chế độ xem lưới không hiển thị dữ liệu chính xác. designation_group_id là một tập hợp các giá trị được phân tách bằng dấu phẩy. cột đầu tiên của chế độ xem lưới sẽ là chỉ định, trong khi bộ lọc của cùng một cột nên là DesignationGroup.group_name – user7282

0

Nếu tôi hiểu bạn, có vẻ như vấn đề của tôi cách đây vài ngày. check this out

Tôi có ba bảng (contact, contact_groups và contact_contact_groups) có quan hệ nhiều-nhiều. Nó có nghĩa là một liên hệ có nhiều nhóm và một nhóm có nhiều địa chỉ liên hệ. Vì vậy, tôi tạo ra một bảng để làm cho quan hệ Một-nhiều.

nhưng kết quả sẽ như thế này:

contact | contact groups 
------------------------- 
contact #1 | business1, business2, family 
contact #2 | family 
contact #3 | student, partner 
Các vấn đề liên quan