加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 使用CDbCriteria和CActiveDataProvider进行连接的Yii

发布时间:2020-12-13 17:23:12 所属栏目:PHP教程 来源:网络整理
导读:这个问题似乎弹出了很多,但没有一个答案帮助我解决了我的问题. 摘要 我正在使用Yii创建一个应用程序; 我有三张桌子,我正在尝试加入并过滤其中两张; 我正在尝试使用CDbCriteria和CActiveDataProvider来进行连接和过滤; 我有所有表的模型,但是当我尝试加入它们
这个问题似乎弹出了很多,但没有一个答案帮助我解决了我的问题.

摘要

>我正在使用Yii创建一个应用程序;
>我有三张桌子,我正在尝试加入并过滤其中两张;
>我正在尝试使用CDbCriteria和CActiveDataProvider来进行连接和过滤;
>我有所有表的模型,但是当我尝试加入它们时,我得到一个SQL错误.

我为要加入和过滤的表创建了一个模型.

记录

class Record extends CActiveRecord {
    public $owner;
    ...
    public function rules() {
        return array(
            array('given_name,family_name,dob,gender','required'),array('qr_id,site_id','numerical','integerOnly' => true),array('given_name,madin_name','length','max' => 100),array('country_of_birth,country_of_death,title','max' => 45),array('gender','max' => 5),array('dod,profile,epitaph','safe'),array('id,qr_id,given_name,madin_name,dod,country_of_birth,gender,owner','safe','on' => 'search'),);
}

    ...
    public function relations() {
        return array(
            'families_left'  => array(self::HAS_MANY,'Family','record_left_id'),'families_right' => array(self::HAS_MANY,'record_right_id'),'headstones'     => array(self::HAS_MANY,'Headstone','record_id'),'other_names'     => array(self::HAS_MANY,'OtherName','users'          => array(self::MANY_MANY,'Users','record_owner(record_id,user_id)'),'record_owner'   => array(self::HAS_MANY,'RecordOwner',);
    }
    ...
}

RecordOwner

class RecordOwner extends CActiveRecord {
    ...
    public function relations() {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array();
    }
    ...
}

问题

我有更新搜索在record_owner上添加了一个条件到CDbCriteria,我在record_owner.user_id上添加了一个比较但现在得到SQL错误.

搜索()

public function search() {
    // Warning: Please modify the following code to remove attributes that
    // should not be searched.

    $criteria = new CDbCriteria;

    $criteria->compare('id',$this->id);
    $criteria->compare('qr_id',$this->qr_id);
    $criteria->compare('given_name',$this->given_name,true);
    $criteria->compare('family_name',$this->family_name,true);
    $criteria->compare('madin_name',$this->madin_name,true);
    $criteria->compare('dob',$this->dob,true);
    $criteria->compare('dod',$this->dod,true);
    $criteria->compare('country_of_birth',$this->country_of_birth,true);
    $criteria->compare('country_of_death',$this->country_of_death,true);
    $criteria->compare('gender',$this->gender,true);
    $criteria->compare('title',$this->title,true);

    $criteria->with = array('record_owner');
    $criteria->compare( 'record_owner.user_id',$this->owner,true );

    return new CActiveDataProvider(
        $this,array(
             'criteria'   => $criteria,'pagination' => array(
                 'pageSize' => Yii::app()->params['pageSize'],)
        )
    );
}

SQL错误

CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'record_owner.user_id' in 'where clause'. The SQL statement executed was: SELECT `t`.`id` AS `t0_c0`,`t`.`qr_id` AS `t0_c1`,`t`.`given_name` AS `t0_c2`,`t`.`family_name` AS `t0_c3`,`t`.`madin_name` AS `t0_c4`,`t`.`dob` AS `t0_c5`,`t`.`dod` AS `t0_c6`,`t`.`country_of_birth` AS `t0_c7`,`t`.`country_of_death` AS `t0_c8`,`t`.`gender` AS `t0_c9`,`t`.`profile` AS `t0_c10`,`t`.`epitaph` AS `t0_c11`,`t`.`site_id` AS `t0_c12`,`t`.`title` AS `t0_c13` FROM `record` `t` WHERE (record_owner.user_id LIKE :ycp0) ORDER BY `t`.`given_name` LIMIT 25

我该怎么做这个加入和过滤?

解决方法

添加$criteria-> together = true;到搜索方法.

看一下这个解释:

http://www.yiiframework.com/doc/api/1.1/CDbCriteria#together-detail

特别是,

When this property is not set,if the primary table is limited or
paginated,a SQL statement will be executed for each HAS_MANY
relation. Otherwise,a single SQL statement will be executed for all.

由于您没有设置此值,并且正在使用分页,因此将通过对到达结果的单独查询来获取record_owners.当然,假设查询实际完成了.

通过设置$criteria-> together = true;您强制执行单个查询的查询,这通过执行表连接来完成,这是您希望通过相关表中的一列过滤查询.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读