Yii框架多表查询:一对一和多表条件联合查询

2014-04-11 14:11:50来源:oschina作者:

在网上查过了很多yii框架多表查询的问题,但总没有适合自己的,自己建了几张表过来分析,把操作写出来分享Yii框架多表查询(一对一与多对一)和多表条件联合查询给大家:

在网上查过了很多yii框架多表查询的问题,但总没有适合自己的,自己建了几张表过来分析,把操作写出来分享Yii框架多表查询(一对一与多对一)和多表条件联合查询给大家:

查一对一或多对一(常使用到的就是文章和文章分类关系)

在yii数据库模型中比如有一个Post.php文件

代码如下:

class Post extends CActiveRecord{
    /*
     * 返回当前模型对象的静态方法
     * 重写父类CActiveRecord对应的方法
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }
   
    /*
     * 返回当前数据表的名字
     *  重写父类CActiveRecord对应的方法
     */
    public function tableName() {
        return ‘{{post}}’;
    }
    //关联查询
    public function relations()
    {
        return array(

        //Post与User的关系是BELONGS_TO(多对一)关系,这里的author_id是User中的author_id

        //’select’=>’id,username’查出来的字段

            ‘author’=>array(self::BELONGS_TO, ‘User’, ‘author_id’,'select’=>’id,username’),
        );
    }
}

需要弄清楚的几点:

  • (1),VarName是指一个对像;
  • (2),RelationType。一共有4种,分别为self::HAS_MANY, self::BELONGS_TO, self::MANY_MANY, self::HAS_ONE。
  • (3),ClassName。即关联的另一个../model/类名.php。
  • (4),ForeignKey。谁是谁的外键?
  • (5),附加条件

要是在操作器中使用,那么我们得这么写:

    public function actionIndex(){
        $post=post::model();
        $criteria = new CDbCriteria();

        //加一个条件就是author_id=2的

        //$criteria->condition =”author_id=2″;

        //这个是按什么条件排序

        //$criteria->order = ‘t.author_id ASC’;

        $criteria->with = array ( ‘author’ );
        $result =$post->findAll( $criteria );
        print_r($result);

    }

以上的例子使用原生态的sql语句是这样么写的:

SELECT * FROM wn_post as p left join wn_user as u ON u.id=p.author_id

多表条件联合查询

根据网上查到的文章及YII官网介绍,整了好长时间。配置好relations。在search函数中需要如下处理:

// 指明关联表
$criteria->with = array('authorizationProducts');

// 设置查询条件
if($this->ap_status != '-1')
{
     // together设置为True时,关联表的数据会一起加载。否则会报错。
 $criteria->together = TRUE;
        $criteria->compare('authorizationProducts.ap_status', $this->ap_status);
}
设置$criteria->together这步很重要,不然总是会报SQL语法错误。

关键词:Yii框架查询

赞助商链接: