1

出席者、イベント、場所の 3 つのエンティティがあり、すべての出席者に 1 つのイベントがあり、すべてのイベントに 1 つの場所があります - 出席者の 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 に答える