1

给定 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显示为一列,但不可排序也不可搜索。我如何实现这一目标?

4

1 回答 1

2

在您的 ModelSearch 中进行排序

添加排序条件,例如:

      $dataProvider->setSort([
        'attributes' => [
            'location.name' => [
                            'asc' =>    [ 'location.name' => SORT_ASC],
                            'desc' =>   [ 'location.name' => SORT_DESC],
                            'label' =>  'location.name'
                        ],      

对于查询,将您的查询条件添加到其他查询中,例如:

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

您可以在本教程中找到有用的示例

于 2015-11-21T17:55:45.993 回答