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;
}
}