ПРИСОЕДИНЯЙТЕСЬ к нескольким таблицам, используя отношения в Yii2

Я пытаюсь перечислить некоторые данные через Kartik GridView виджет в 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_groupCREATE 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 таблица связана с designation_group от designations.designation_group_id , designations таблица будет иметь одно или несколько значений, разделенных запятой, из designation_group.id ,

designations таблица связана с персоналом staffs.designation_id =designations.id,
В Staffs Модель я добавил отношения, как это

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

и работает отлично. Но отношение для designation_group Я пытался так:

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

Но это не дает ожидаемого результата.
Как designation_group таблицу можно объединить так, чтобы все обозначения группы, связанные с персоналом, также могли отображаться?
Я хочу показать как, первый столбец сетки будет обозначениями, а фильтр того же столбца должен быть DesignationGroup.group_name. Поэтому, если выбрано какое-либо имя группы, на нем будут показаны данные о персонале, связанном с этим именем группы.

8

Решение

Итак, из того, что я смог извлечь из вашего вопроса, вы хотите получить название группы для каждого из сотрудников. Код ниже поможет вам выполнить эту задачу.

Внутри модели персонала создайте отношения, как указано ниже, или вы можете использовать существующую, которая, я уверен, Yii автоматически создаст для вас.

Модель ПЕРСОНАЛА

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

Внутри модели обозначения создайте другое отношение, которое связывает модель отмены с моделью designationGroup, которая также будет создана автоматически

Обозначение модели

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

Наконец, в вашем gridview вы можете использовать код ниже, чтобы получить имя группы

$model->destination->designationGroup->group_name

Я надеюсь, что это решит вашу проблему. Хотя я использовал это пару раз.

2

Другие решения

Если я вас понимаю, это похоже на мою проблему несколько дней назад. Проверь это

У меня есть три таблицы (contact, contact_groups и contact_contact_groups), которые имеют отношение многие ко многим. Это означает, что у одного контакта много групп, а у одной группы много контактов. Поэтому я создаю одну таблицу, чтобы сделать отношения один-ко-многим.

но результат понравится так:

contact | contact groups
-------------------------
contact #1 | business1, business2, family
contact #2 | family
contact #3 | student, partner
0

модель персонала

использование ->with(['designationgroup'])

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

модель обозначения

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

На GridView , представить значение как

$model->destination->designationgroup->group_name

Надеюсь, поможет.

0

Я предложу вам удалить столбец designation_group_id из таблицы обозначений, поскольку она содержит несколько значений, разделенных запятыми. Создайте еще одну таблицу с именем designation_group_assigned, которая будет иметь следующие столбцы: Id, designation_id, designation_group_id

В этой таблице мы можем вставить несколько строк, если одно обозначение принадлежит нескольким группам.

И тогда вы можете использовать отношения yii для одной или нескольких записей.

-1
По вопросам рекламы [email protected]