Yii1中用CDbCriteria进行多表链接查询数据只有一个表字段的解决方法 [ 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个网站中的内容,都是一样的,感觉还是国人太懒了,所以,不经过本人同意不得有抄袭,复制等侵犯本人权益的行为。否则追究法律责任!也希望大家在学习过程中互相学习,多思考!
职业第三者 广州
注册时间:2017-05-11
最后登录:2018-07-09
在线时长:7小时22分
最后登录:2018-07-09
在线时长:7小时22分
- 粉丝3
- 金钱125
- 威望30
- 积分495
共 2 条评论
123123
2.0的版本咋么用
怎么用new CDbCriteria
错误提示