一步一步学Yii开发(四) – 关联数据表的访问

接上一篇

一步一步学Yii开发(三)

从这一篇开始我们介绍Yii开发的进阶部分-关联数据表的访问。其实在

一步一步学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的角色名。

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *