2017-11-30 15 views
0

해당 사이트에 대한 URL 및 정보가 포함 된 테이블이 있습니다. 각 URL은 한두 번 나타날 수 있습니다. 해당 사이트의 첫 번째 및 마지막 스캔 나는 첫 번째 스캔의 URL과 등급에 의해 검색이 가능한 gridview에 데이터를 표시하고 두 번째 스캔의 등급이 존재하는 경우 표시하려고합니다. 내가 모두로드 할 때 나는 정확한 데이터를 얻는다. URL, 등급, 등급 2. 그러나 학년별로 검색하려고하면 두 번 스캔 한 사이트 만 데이터베이스에 두 번 나타나므로 데이터베이스에있는 사이트는 한 번 무시됩니다.Yii2 : 자체 조인 관계 검색 문제가있는 모델

table: 

id url  initial points grade 
1 blue.com 1   10  F 
2 red.com  1   20  F 
3 blue.com 0   50  C 
etc... 
display in gridview works fine 

no url  points grade points2 grade2 
1 blue.com 10  F  50  C 
2 red.com  20  F not set not set 
etc... 

하지만 URL 또는 등급 그것에 의해 테이블에

에서 모델을 두 번째 검사가있는 경우에만 표시 결과를 검색 할 때 :

public $parentid; 
    public $parentpoints; 
    public $parentgrade; 

    public function rules() 
    { 
     return [ 
      [[........'parentpoints'.........], 'integer'], 
      [['url', 'parentgrade', .........], 'safe'], 
     ]; 
    } 





    public function search($params) 
    { 
     $query = SitesTemp::find(); 
     $query->where(['sites_temp.for_scan'=>0, 'sites_temp.initial'=>1]); 

     // add conditions that should always apply here 

     $dataProvider = new ActiveDataProvider([ 

      'query' => $query, 
     ]); 

     $dataProvider->setSort([ 
      'attributes'=>[ 
       'url', 
       'points', 
       'grade', 
      'parentgrade'=>[ 
       'asc'=>['parent.grade'=> SORT_ASC], 
       'desc'=>['parent.grade'=> SORT_DESC], 
       'label'=>'Last Grade' 
      ], 
       'parentpoints'=>[ 
       'asc'=>['parent.points'=> SORT_ASC], 
       'desc'=>['parent.points'=> SORT_DESC], 
       'label'=>'Last Points' 
      ], 
       ] 
     ]); 

     $this->load($params); 

     if (!($this->load($params) && $this->validate())) { 


      $query->joinWith(['parent']); 
      return $dataProvider; 
     } 


     $query->andFilterWhere([ 
      'sites_temp.id' => $this->id, 
      'sites_temp.initial' => $this->initial, 
      'sites_temp.points' => $this->points, 

     ]); 

     $query->andFilterWhere(['like', 'sites_temp.url', $this->url]) 
       ->andFilterWhere(['like', 'sites_temp.grade', $this->grade]) 
        ->andFilterWhere(['like', 'sites_temp.points', $this- 
     >points]); 

     $query->joinWith(['parent'=>function($q){ 
      $q->where('parent.grade like "%'.$this->parentgrade.'%"'); 
     }]); 

     return $dataProvider; 
     } 
     } 

답변

0
: 검색 모델에서

 public function getParent() { 
     return $this->hasOne(self::classname(), ['url' => 'url'])-> 
       from(self::tableName() . ' AS parent')- 
     >onCondition(['parent.initial'=>0]); 
      } 
      public function getParentid(){ 
     return $this->parent->id; 
      } 
     public function getParentgrade(){ 
     return $this->parent->grade; 
     } 
     public function getParentpoints(){ 
     return $this->parent->points; 
     } 

나는 그것을 알아 낸다.

검색 매개 변수가 존재하는 경우에만 joinWith를 입력해야합니다. 그래서

if(!empty($this->parentgrade)){ 
     $query->joinWith([parent=>function($q){ 
      $q->where('parent.grade like "%'.$this->parentgrade.'%"'); 
     }]); } 

내 문제를 해결