职业第三者 2017-06-28 16:14:36 9031次浏览 2条评论 2 1 1

在业务逻辑稍微复杂的情况下我们都需要进行多表链接查询!
我们都知道CDbCriteria常用的操作有这些:

$criteria = new CDbCriteria; 
$criteria->addCondition("id=1"); //查询条件,即where id =1  
$criteria->addInCondition('id', array(1,2,3,4,5));//代表where id IN (1,23,,4,5,);  
$criteria->addNotInCondition('id',array(1,2,3,4,5));//与上面正好相法,是NOT IN  
$criteria->addCondition('id=1','OR');//这是OR条件,多个条件的时候,该条件是OR而非AND 
$criteria->addSearchCondition('name','分类');//搜索条件,其实代表了。。where name like '%分类%'  
$criteria->addBetweenCondition('id', 1, 4);//between1 and 4   

$criteria->compare('id',1);   //这个方法比较特殊,他会根据你的参数自动处理成addCondition或者addInCondition,即如果第二个参数是数组就会调用addInCondition  

$criteria->addCondition("id = :id"); 
$criteria->params[':id']=1;  

$criteria->select = 'id,parentid,name';//代表了要查询的字段,默认select='*';  
$criteria->join = 'xxx'; //连接表 
$criteria->with = 'xxx';//调用relations   
$criteria->limit =10;   //取1条数据,如果小于0,则不作处理  
$criteria->offset =1;   //两条合并起来,则表示 limit 10 offset1,或者代表了。limit 1,10  
$criteria->order = 'xxx DESC,XXX ASC' ;//排序条件 
$criteria->group = 'group 条件'; 
$criteria->having = 'having 条件 '; 
$criteria->distinct = FALSE;//是否唯一查询

所以我们在使用多表链接的时候会这样操作:

$workCriteria = new CDbCriteria();
$workCriteria->join = 'LEFT JOIN oa_packing_order as po ON po.id=t.packing_order_id LEFT JOIN oa_packing_material as pm ON po.packingid=pm.id';

$workCriteria->select = "t.*,pm.type,po.packing,po.supplier,po.number,po.code";
$workCriteria->addCondition("查询条件");
$workCriteria->order = $order = '排序方法';
$model = Reports::model()->findAll($workCriteria);

可以这样得到的结果却只是我Reports这个表的字段,我在网上查了一下,也没找到原因,但是如果你把sql语句打印出来执行发现并没有什么问题

后来我在模型中relations方法中这么写:

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(
      'packing_order'=>array(
          self::BELONGS_TO,
          'PackingOrder', 
          ['packing_order_id' => 'id'],
          'select'=>'packing,supplier,number,code'
      ),
  );
}

奇迹竟然出现了,我所连的三个表的数据都可以查出来了!(注意查出来的数据是一个对象!!并不是数组)

很多像我这样的新手可能不知道relations里面应该怎么写,特别是多个表之间连接查询的时候,这时候你可以参考一下官方类手册http://www.yiichina.com/doc/api/1.1/CActiveRecord#relations-detail

提醒一个就是,有多个比如3个A,B,C表连接时,A.bid=B.id,b.cid = c.id这种连接情况时,
在A模型的relations中这么写:

'packing_order'=>array(self::BELONGS_TO, 'B', ['a.bid' => 'b.id'],'with'=>'B模型中的relations_name'), 

在B的模型relations中这么写:

'relations_name'=>array(self::BELONGS_TO, 'C', ['b.cid' => 'c.id']), 

这样的话三个表就能连起来啦!!

ps:不知道是国内的搜索引擎不给力还是我们国人太懒,每次遇到新问题想百度的时候搜出的n+1天结果,n个网站中的内容,都是一样的,感觉还是国人太懒了,所以,不经过本人同意不得有抄袭,复制等侵犯本人权益的行为。否则追究法律责任!也希望大家在学习过程中互相学习,多思考!

觉得很赞
您需要登录后才可以评论。登录 | 立即注册