接上一篇
从这一篇开始我们介绍Yii开发的进阶部分-关联数据表的访问。其实在
我们已经介绍了如何访问数据表的数据,就是
$model = [模型类名]::model()->find( … )
或者是
$model = [模型类名]::model()->findAll( … )
但是这样通常获取出来的数据只是针对一个一个表,但是我们实际应用中不可能都是单个表,互不关联。比如我们创建用户的表
id | name | role |
---|
另外还有一个是role的,用来说明用户的类型,如admin还是普通用户等
id | name | description |
---|
这样的话,用户表的role其实就是一个外键,指向了表色标的id。
如果我们不做一定的关联的话,我们得出的role的值就是角色表中的id的数值,为了知道角色名还需要在查询一次。但是我们如果能一次得到角色名那多好啊。其实Yii已经做到了这一点,我们只需要在对应的模型类的定义他们之间的关系就可以。
我们通常使用Yii的Gii工具,选择一个表,然后来生成对应的模型类。当这个模型类生成的时候,Yii已经根据表的外键的关系为我们建立映射关系,这些关系定义在,relations这个函数中,但是它生成的关系往往是错误的,主要是类名和关联名。因此我们要做调整,比如前面我们举例的User这个模型类,
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(
‘role0’ => array(self::BELONGS_TO, ‘Role’, ‘role’),
);
}
看一下,最前面的是‘role0’,其实这个是定义了一个变量,将来我们可以使用这个变量访问Role对象,这个变量的名字你可以随便取了,但是不要外键的名字一样,在这个例子中就是不要是role。然后是
self::BELONGS_TO这样的关系指定符,其实是Yii定义的常量,除了这个还有
HAS_MANY
HAS_ONE
MANY_MANY
具体的意义,可以参考
http://www.yiiframework.com/doc/guide/1.1/en/database.arr
我们例子中user对role的关系就是belong to的关系,后面的'role'是关联名这个很重要,不能错。否则查询不到我们的对象,这个例子中就是role对象。user表中对应role的外键是role,所以这里应该写role。
然后再看看Role这个模型类中,我们需要这样定义关系:
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(
'user' => array(self::HAS_MANY, 'User', 'role'),
);
}
role对user关系就是has_many的关系,然后role在user中外键是role。
定义好关系后,我们通过一次查询来访role对象中的name,
$model = User::model()->findBySql( "SELECT * FROM user WHERE name='lucy'" );
$role = $model->role0;
echo $role->name;
看看是不是可以成功打印出lucy的角色名。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.