yii2如何使1:1:1关系在GridView中可排序和搜索

时间:2015-11-21 17:05:19

标签: gridview yii2 yii-widgets

鉴于3个实体与会者,事件,位置,每个与会者都有一个事件,每个事件都有一个位置 - 如何在与会者的GridView中显示可排序且可搜索的位置列名称?

模式

CREATE TABLE `attendee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`eventId` int(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_attendee_event` FOREIGN KEY (`eventId`) REFERENCES `event` (`id`))

 CREATE TABLE `event` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
 `locationId` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 CONSTRAINT `fk_e_l` FOREIGN KEY (`locationId`) REFERENCES `location` (`id`))

 CREATE TABLE `location` (
`id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL) 

我使用gii生成了模型和crud。

我希望参加者的GridView中的位置名称可以排序和搜索。

我想我必须通过事件定义与会者和位置之间的关系:

public function getLocation()
 {
     return $this->hasOne(Location::className(), ['id' => 'locationId'])->via('event');
}

在_columns.php中,我将location.name添加为列:

[
    'class'=>'\kartik\grid\DataColumn',
    'attribute'=>'location',
    'value' => 'location.name'

], 

location.name显示为列,但不可排序也无法搜索。我如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

在ModelSearch中进行排序

添加排序条件,例如:

      $query->joinWith(['location' => function ($q) {
         $q->where( 'name LIKE "%' . $this->location_name . '%"');
      }]);

for query将查询条件添加到另一个查询中,例如:

{{1}}

您可以在this tutorial

中找到有用的示例