对于多条数据的AR查询,我们通常使用饥渴式加载
public function actionAll(){
$users = User::model()->with('city','user_info')->findAll();
dump($users);
}
打印结果如下图
![](http://static.oschina.net/uploads/space/2013/1012/130748_YL3h_1165126.png)
对于关联的表,我们还可以指定查询的条件,排序等等一些查询选项
比如我们指定只查询city表的name字段,with方法里需要用数组作为参数
public function actionAll(){
$users = User::model()->with(array(
'city'=>array('select'=>'city.name'),
'user_info'
))->findAll();
dump($users);
}
如下图,我们看到只取出了name和id字段的值,id是默认要取出来的
![](http://static.oschina.net/uploads/space/2013/1012/130930_cFun_1165126.png)
比如我们还可以指定查询的条件
public function actionAll(){
$users = User::model()->with(array(
'city'=>array('select'=>'city.name','condition'=>'city.id=1'),
'user_info'
))->findAll();
dump($users);
}
如图,查询结果只剩下一条符合city.id为1的
关联查询时可以附加的类似condition这样的条件有很多,如下图,详细可以参考官方权威指南
对于多数据的查询,更加灵活的做法是使用 查询生成器对象 CDbCriteria
像上面的查询场景我们可以表述为
public function actionAll(){
$criteria = new CDbCriteria();
$criteria->with = array(
'city'=>array('select'=>'city.name','condition'=>'city.id=1'),
'user_info'
);
$users = User::model()->findAll($criteria);
dump($users);
}
作者注:尽管YII为我们封装了优秀的AR查询方法,对于多条数据的查询来说,推荐大家使用更加高效的DAO方式,同样的查询条件DAO效率应该是AR的4倍左右。