在网上查过了很多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