Я пытаюсь перечислить некоторые данные через 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. Поэтому, если выбрано какое-либо имя группы, на нем будут показаны данные о персонале, связанном с этим именем группы.
Итак, из того, что я смог извлечь из вашего вопроса, вы хотите получить название группы для каждого из сотрудников. Код ниже поможет вам выполнить эту задачу.
Внутри модели персонала создайте отношения, как указано ниже, или вы можете использовать существующую, которая, я уверен, 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
Я надеюсь, что это решит вашу проблему. Хотя я использовал это пару раз.
Если я вас понимаю, это похоже на мою проблему несколько дней назад. Проверь это
У меня есть три таблицы (contact, contact_groups и contact_contact_groups), которые имеют отношение многие ко многим. Это означает, что у одного контакта много групп, а у одной группы много контактов. Поэтому я создаю одну таблицу, чтобы сделать отношения один-ко-многим.
но результат понравится так:
contact | contact groups
-------------------------
contact #1 | business1, business2, family
contact #2 | family
contact #3 | student, partner
модель персонала
использование
->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
Надеюсь, поможет.
Я предложу вам удалить столбец designation_group_id
из таблицы обозначений, поскольку она содержит несколько значений, разделенных запятыми. Создайте еще одну таблицу с именем designation_group_assigned, которая будет иметь следующие столбцы: Id
, designation_id
, designation_group_id
В этой таблице мы можем вставить несколько строк, если одно обозначение принадлежит нескольким группам.
И тогда вы можете использовать отношения yii для одной или нескольких записей.