【问题标题】:Yii2: model with self join relation search issueYii2:具有自连接关系搜索问题的模型
【发布时间】:2017-12-01 17:22:50
【问题描述】:

我有一个表格,其中包含有关这些网站的网址和信息。每个 url 可以出现一次或两次。该站点的第一次和最后一次扫描。我想通过 url 和第一次扫描的等级以及是否存在第二次扫描的等级在 gridview 中显示数据。当我加载所有内容时,我得到了正确的数据。网址,等级,等级2。但是,当我尝试按等级搜索时,我只得到已扫描两次的网站,因此它们在数据库中出现了两次,而仅在数据库中出现一次的网站将被忽略。

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

在搜索模型中:

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

【问题讨论】:

    标签: model yii2 self-join


    【解决方案1】:

    我想通了。

    仅当存在搜索参数时,我才需要加入 joinWith。所以

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

    解决了我的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多