2016-07-08 3 views
0

에서 관련 모델을 먼저 정렬 해주세요. 비슷한 질문이 있습니다. Filter setup for related model in GridView. 나는 그것을 따라하려고했지만 그 트릭을하지 않았다.Search + GridView (yii2)

나는 또한가는 방법에 대한 다른 가이드를 확인했지만 여전히 붙어 있습니다. 참고로 , 난 여전히 내보기에서 검색 필드 + 정렬 기능이없는, 여기 그러나

  • http://www.yiiframework.com/wiki/653/displaying-sorting-and-filtering-model-relations-on-a-gridview/

    http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#working-with-model-relations

    • 이 가이드를 따라 갔다.

      나는 CRUD 기능을 만들기 위해 gii을 사용했다.

      내 Manufacturers.php (모델) :

      // basic model, nothing special here. 
      // The following line was added to create a relation 
      public function getVendor() 
      { 
          return $this->hasOne(Vendors::className(), ['vendor_id' => 'vendor_id']); 
      } 
      

      내 ManufacturersSearch.php (모델) :

      namespace app\models; 
      
      use Yii; 
      use yii\base\Model; 
      use yii\data\ActiveDataProvider; 
      use app\models\Manufacturers; 
      
      /** 
      * ManufacturersSearch represents the model behind the search form about `app\models\Manufacturers`. 
      */ 
      class ManufacturersSearch extends Manufacturers 
      { 
          public $vendor; 
          /** 
          * @inheritdoc 
          */ 
          public function rules() 
          { 
           return [ 
            [['manufacturer_id', 'vendor_id'], 'integer'], 
            [['name', 'vendor'], 'safe'], 
           ]; 
          } 
      
          /** 
          * @inheritdoc 
          */ 
          public function scenarios() 
          { 
           // bypass scenarios() implementation in the parent class 
           return Model::scenarios(); 
          } 
      
          /** 
          * Creates data provider instance with search query applied 
          * 
          * @param array $params 
          * 
          * @return ActiveDataProvider 
          */ 
          public function search($params) 
          { 
           $query = Manufacturers::find(); 
           $query->joinWith("vendor"); 
      
           // add conditions that should always apply here 
      
           $dataProvider = new ActiveDataProvider([ 
            'query' => $query, 
           ]); 
      
           $dataProvider->sort->attributes['vendor_name'] = [ 
            // The tables are the ones our relation are configured to 
            // in my case they are prefixed with "tbl_" 
            'asc' => ['vendor.name' => SORT_ASC], 
            'desc' => ['vendor.name' => SORT_DESC], 
           ]; 
      
           if (!$this->load($params) && $this->validate()) { 
            // uncomment the following line if you do not want to return any records when validation fails 
            // $query->where('0=1'); 
            return $dataProvider; 
           } 
      
           // grid filtering conditions 
           $query->andFilterWhere([ 
            'manufacturer_id' => $this->manufacturer_id, 
            'vendor_id' => $this->vendor_id, 
           ]); 
      
           $query->andFilterWhere(['like', 'name', $this->name]); 
           $query->andFilterWhere(['like', 'vendor.vendor', $this->vendor]); 
           return $dataProvider; 
          } 
      } 
      

      그리고 마지막으로 내보기 파일 :

      <?php Pjax::begin(); ?> <?= GridView::widget([ 
          'dataProvider' => $dataProvider, 
          'filterModel' => $searchModel, 
          'columns' => [ 
           ['class' => 'yii\grid\SerialColumn'], 
           'name', 
           [ 
            'label' => 'Hauptlieferant', 
            'value' => 'vendor.name', 
           ], 
           ['class' => 'yii\grid\ActionColumn'], 
          ], 
      ]); ?> 
      <?php Pjax::end(); ?></div> 
      

      이 내 전류 출력 :

      Correct names (instead of id's) - still not sortable

      그래서, 좀 노력하고, 이후 대신 ID의, 나는 (내가 원하는 것입니다) 이름을 얻고있다. 그러나 어떤 이유로 이러한 필드는 정렬 할 수 없으며 검색 할 수 없습니다.

      표 "제조업체"뿐만 아니라 테이블 "공급 업체"열 "이름"올바른 방향으로 어떤 힌트를

      감사가 있습니다.

    답변

    1

    ManufactuiresSearch에서는 필터도 joinWith 필요

    $query->andFilterWhere(['like', 'name', $this->name]); 
    
        $query->joinWith(['vendor' => function ($q) { 
         $q->andFilterWhere(['like', 'vendor.vendor', $this->vendor]); 
        }]); 
    
        return $dataProvider; 
    
    관련 문제