PHP开发框架Yii Framework教程(27) 数据库-关联Active Record示例

我们已经了解了怎样使用 Active Record (AR) 从单个数据表中获取数据。 在本节中,我们讲解怎样使用 AR 连接多个相关 数据表并取回关联(join)后的数据集。

为了使用关系型 AR,我们建议在需要关联的表中定义主键-外键约束。这些约 束可以帮助保证相关数据的一致性和完整性。

本例通过修改Yii Framework 开发教程(25) 数据库-Query Builder示例来 介绍多个有关系的表如何使用Active Record。

在我们使用 AR 执行关联查询之前,我们需要让 AR 知道一个 AR 类是怎 样关联到另一个的。

两个 AR 类之间的关系直接通过 AR 类所代表的数据表之间的关系相关联。 从数据库的角度来说, 表 A 和 B 之间有三种关系:一对多(one-to-many,例如 tbl_user 和 tbl_post),一对一( one-to-one 例如 tbl_user 和 tbl_profile)和 多对多(many-to-many 例如 tbl_category 和 tbl_post)。 在 AR 中,有四种关系:

BELONGS_TO( 属于): 如果表 A 和 B 之间的关系是一对多,则 表 B 属于 表 A (例如 Post 属于 User);

HAS_MANY(有多个): 如果表 A 和 B 之间的关系是一对多,则 A 有多个 B (例如 User 有多个 Post);

HAS_ONE(有一个): 这是 HAS_MANY 的一个特例 ,A 最多有一个 B (例如 User 最多有一个 Profile);

MANY_MANY: 这个对应于数据库中的 多对多 关系。 由于多数 DBMS 不直接支持 多对多 关系,因此需要有一个关联表将 多对多 关系分割为 一对多 关系。 在我们的示例数据结构中, tbl_post_category 就是用于此目的的。在 AR 术语中,我们可以解释 MANY_MANY 为 BELONGS_TO 和 HAS_MANY 的组合。 例如 ,Post 属于多个(belongs to many) Category ,Category 有多个(has many) Post.

AR 中定义关系需要覆盖 CActiveRecord 中的 relations() 方法。此方法返回一个关系配置数组。每个数组元素通过如下格式表示一个单一的关系。

在Query Builder中我们使用了下面SQL查询语句

SELECT c.FirstName, c.LastName , c.Address,c.Email
FROM customer c
INNER JOIN
employee e
ON c.SupportRepId=e.EmployeeId
WHERE e.EmployeeId=4

涉及到两个表格Employee 和 Customer,Employee和Customer之间是一对多的关系,也就是说 一个员工可以负责多个客户。Employee到Customer的关系为HAS_MANY, Customer到Employee的关系为HAS_ONE。因此可以定义 Employee和Customer如下:

//Customer.php
class Customer extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }     

    public function tableName()
    {
        return 'Customer';
    }     

}     

//Employee.php
class Employee extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }     

    public function tableName()
    {
        return 'Employee';
    }     

    public function relations()
    {
        return array(
            'customers'=>array(self::HAS_MANY, 'Customer', 'SupportRepId'),     

            );
    }
}

因为本例只使用到由Employee查询对应的Customer,因此只为类定义了relations方法。对应的表和外键为Customer 和SupportRepId。
然后修改SiteController的indexAction方法:

public function actionIndex()
{     

    $employee=Employee::model()->findByPk(4);     

    $this->render('index', array(
        'model' => $employee->customers,     

        ));
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索function
, ar9331
, ar
, public
, 关联
, 多个
, many
, 一个
, 之间
yii关联查询
yii activerecord、yii2 activerecord、yii2 activerecord in、yii activerecord sql、yii isnewrecord,以便于您获取更多的相关知识。

时间: 2025-01-21 15:09:31

PHP开发框架Yii Framework教程(27) 数据库-关联Active Record示例的相关文章

PHP开发框架Yii Framework教程(26) 数据库-Active Record示例

使用Java或是.Net 写数据库应用,很多人都用过Hibernate(或NHibernate)可以大大简化数据库编程,而以对象的方式来 读写数据库(ORM),Yii提供的Active Record (AR) 也是一个流行的 对象-关系映射 (ORM) 技术.每个 AR 类代表一个数据表 (或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示表中的一行. 常见的 CRUD 操作作为 AR 的方法实现.因此,我们可以以一种更加面向对象的方式访问数据. 这里修改Yii

PHP开发框架Yii Framework教程(23) 数据库-概述

Yii提供了强大的数据库编程支持. Yii数据访问对象(DAO)建立在PHP的数据对象(PDO)extension上,使得在一个单一 的统一的接口可以访问不同的数据库管理系统(DBMS).使用Yii的DAO开发的应用程序可以很容易地切换使用不同的数据库管理系 统,而不需要修改数据访问代码. Yii 的Active Record( AR ),实现了被广泛采用的对象关系映射(ORM)办法,进一步简 化数据库编程.按照约定,一个类代表一个表,一个实例代表一行数据.Yii AR消除了大部分用于处理CRU

PHP开发框架Yii Framework教程(24) 数据库-DAO示例

据访问对象(DAO) 对访问存储在不同数据库管理系统(DBMS)中的数据提供了一个通用的API. 因此,在将底层 DBMS 更 换为另一个时,无需修改使用了 DAO 访问数据的代码. Yii DAO 基于 PHP Data Objects (PDO) 构建.它是一个为众多 流行的DBMS提供统一数据访问的扩展,这些 DBMS 包括 MySQL, PostgreSQL 等等.因此,要使用 Yii DAO,PDO 扩展和特定的 PDO 数据库驱动(例如PDO_MYSQL) 必须安装. Yii DAO

PHP开发框架Yii Framework教程(25) 数据库-Query Builder示例

上一篇介绍PHP使用DAO(数据库访问对象接口)访问数据库的方法,使用DAO需要程序员编写SQL语句,对于一些复杂的SQL语 句,Yii提供了Query Builder来帮助程序员生成SQL语句,Query Builder提供了一中面向对象的方法动态创建SQL语句,打个不 十分恰当的比较,PHP 的DAO和.Net 的DAO接口非常类型,Query builder 就有点像LINQ了,尽管和LINQ比起来功能小很多.对 于一些简单的SQL查询,通常不需要借助于Query Builder,比如上篇

PHP开发框架Yii Framework教程(21) UI 组件 自定义Captcha示例

Yii内置的Captcha基本上可以满足大部分需求,如果你对验证码有特殊要求,你可以自定义Captcha,这主要是通过扩展 CCaptchaAction来实现的,本例自定义一个验证码功能,随机产生10以内的加减法,用户需要计算出正确的结果才能通过验证. 本例基于上例Yii Framework 开发教程(20) UI 组件 Captcha示例,做如下修改 首先在protected/components 目 录下创建一个MathCaptchaAction,重载generateVerifyCode,

PHP开发框架Yii Framework教程(31) Zii组件-DetailView示例

CDetailView为某个Model显示详细内容.这个要显示的Model可以为CModel或是关联数组. CDetailView通过配置 attributes来决定Model的那些属性需要显示已经以何种格式显示. 每个属性可以使用Name:Type:Label来配置.其中 Type和Label都是可选的. "Name" 属性名称. "Label" 可以选,属性的标签名,如果没有配置,则使用属性名称 做为标签名称. "Type" 属性的类型,通过

PHP开发框架Yii Framework教程(34) Zii组件-AutoComplete示例

CJuiAutoComplete 在用户输入时可以根据用户输入的前几个字符自动提示用户可以输入的文字.它封装了 JUI autocomplete插件. 基本用法如下 <?php $this->widget('zii.widgets.jui.CJuiAutoComplete', array( 'name'=>'city', 'source'=>$data, // additional javascript options for the autocomplete plugin 'op

PHP开发框架Yii Framework教程(28) Data Provider简介

这开始介绍Zii组件之前,先简要介绍一下Yii支持的数据源接口 IDataProvider,IDataProvider主要功能是为UI组件如 GridView,ListView等提供数据源,同时也支持数据的分页和排序.下图为Yii内置的三种数据源: CActiveDataProvider  基于Active Record的数据源 CArraryDataProvider 基于数组的数据源 CSqlDataProvider      基于SQL查询的数据源 开发框架Yii Framework教程(2

PHP开发框架Yii Framework教程(22) UI组件 Zii组件简介

前面介绍了Yii框架支持的部分UI组件,除了前面介绍的UI组件外,Yii框架还提供了Zii组件库,包括列表视图ListView,表 格视图GridView,此外还包括一些基于JQuery的UI组件,如AutoComplete,DataPicker, Button, Drag 和 Drop等,Zii组件主要 定义在包zii.* ,zii.widget.* 开发框架Yii Framework教程(22) UI组件 Zii组件简介-yii2 user组件"> 由于其中部分UI组件和数据源(Dat