当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

活动记录(Active Record): 活动记录对象关系映射(ORM),检索和操作记录、定义关联关系

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:29:00

由  创建, 最后一次修改 2016-02-24 Active Record注意:该章节还在开发中。Active Record?(活动记录,以下简称AR)提供了一个面向对象的接口, 用以访问数据库中的数据。一个 AR 类关联一张数据表, 每个 AR 对象对应表中的一行,对象的属性(即 AR 的特性Attribute)映射到数据行的对应列。 一条活动记录(AR对象)对应数据表的一行,AR对象的属性则映射该行的相应列。 您可以直接以面向对象的方式来操纵数据表中的数据,妈妈再不用担心我需要写原生 SQL 语句啦。例如,假定?Customer?AR 类关联着?customer?表,且该类的?name?属性代表?customer?表的?name?列。 你可以写以下代码来哉customer?表里插入一行新的记录:用 AR 而不是原生的 SQL 语句去执行数据库查询,可以调用直观方法来实现相同目标。如,调用 yii\db\ActiveRecord::save() 方法将执行插入或更新轮询,将在该 AR 类关联的数据表新建或更新一行数据:$customer = new Customer();$customer->name = 'Qiang';$customer->save(); // 一行新数据插入 customer 表上面的代码和使用下面的原生 SQL 语句是等效的,但显然前者更直观, 更不易出错,并且面对不同的数据库系统(DBMS, Database Management System)时更不容易产生兼容性问题。$db->createCommand('INSERT INTO customer (name) VALUES (:name)', [ ':name' => 'Qiang',])->execute();下面是所有目前被 Yii 的 AR 功能所支持的数据库列表:MySQL 4.1 及以上:通过 yii\db\ActiveRecordPostgreSQL 7.3 及以上:通过 yii\db\ActiveRecordSQLite 2 和 3:通过 yii\db\ActiveRecordMicrosoft SQL Server 2010 及以上:通过 yii\db\ActiveRecordOracle: 通过 yii\db\ActiveRecordCUBRID 9.1 及以上:通过 yii\db\ActiveRecordSphinx:通过 yii\sphinx\ActiveRecord,需求?yii2-sphinx?扩展ElasticSearch:通过 yii\elasticsearch\ActiveRecord,需求?yii2-elasticsearch?扩展Redis 2.6.12 及以上:通过 yii\redis\ActiveRecord,需求?yii2-redis?扩展MongoDB 1.3.0 及以上:通过 yii\mongodb\ActiveRecord,需求?yii2-mongodb?扩展如你所见,Yii 不仅提供了对关系型数据库的 AR 支持,还提供了 NoSQL 数据库的支持。 在这个教程中,我们会主要描述对关系型数据库的 AR 用法。 然而,绝大多数的内容在 NoSQL 的 AR 里同样适用。声明 AR 类要想声明一个 AR 类,你需要扩展 yii\db\ActiveRecord 基类, 并实现?tableName?方法,返回与之相关联的的数据表的名称:namespace app\models;use yii\db\ActiveRecord;class Customer extends ActiveRecord{ /** * @return string 返回该AR类关联的数据表名 */ public static function tableName() { return 'customer'; }}访问列数据AR 把相应数据行的每一个字段映射为 AR 对象的一个个特性变量(Attribute) 一个特性就好像一个普通对象的公共属性一样(public property)。 特性变量的名称和对应字段的名称是一样的,且大小姓名。使用以下语法读取列的值:// "id" 和 "mail" 是 $customer 对象所关联的数据表的对应字段名$id = $customer->id;$email = $customer->email;要改变列值,只要给关联属性赋新值并保存对象即可:$customer->email = 'james@example.com';$customer->save();建立数据库连接AR 用一个 yii\db\Connection 对象与数据库交换数据。 默认的,它使用?db?组件作为其连接对象。详见数据库基础章节, 你可以在应用程序配置文件中设置下?db?组件,就像这样,return [ 'components' => [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=testdb', 'username' => 'demo', 'password' => 'demo', ], ],];如果在你的应用中应用了不止一个数据库,且你需要给你的 AR 类使用不同的数据库链接(DB connection) ,你可以覆盖掉 yii\db\ActiveRecord::getDb() 方法:class Customer extends ActiveRecord{ // ... public static function getDb() { return \Yii::$app->db2; // 使用名为 "db2" 的应用组件 }}查询数据AR 提供了两种方法来构建 DB 查询并向 AR 实例里填充数据:yii\db\ActiveRecord::find()yii\db\ActiveRecord::findBySql()以上两个方法都会返回 yii\db\ActiveQuery 实例,该类继承自yii\db\Query, 因此,他们都支持同一套灵活且强大的 DB 查询方法,如where(),join(),orderBy(),等等。 下面的这些案例展示了一些可能的玩法:// 取回所有活跃客户(状态为 *active* 的客户)并以他们的 ID 排序:$customers = Customer::find() ->where(['status' => Customer::STATUS_ACTIVE]) ->orderBy('id') ->all();// 返回ID为1的客户:$customer = Customer::find() ->where(['id' => 1]) ->one();// 取回活跃客户的数量:$count = Customer::find() ->where(['status' => Customer::STATUS_ACTIVE]) ->count();// 以客户ID索引结果集:$customers = Customer::find()->indexBy('id')->all();// $customers 数组以 ID 为索引// 用原生 SQL 语句检索客户:$sql = 'SELECT * FROM customer';$customers = Customer::findBySql($sql)->all();小技巧:在上面的代码中,Customer::STATUS_ACTIVE?是一个在?Customer?类里定义的常量。(译注:这种常量的值一般都是tinyint)相较于直接在代码中写死字符串或数字,使用一个更有意义的常量名称是一种更好的编程习惯。有两个快捷方法:findOne?和?findAll()?用来返回一个或者一组ActiveRecord实例。前者返回第一个匹配到的实例,后者返回所有。 例如:// 返回 id 为 1 的客户$customer = Customer::findOne(1);// 返回 id 为 1 且状态为 *active* 的客户$customer = Customer::findOne([ 'id' => 1, 'status' => Customer::STATUS_ACTIVE,]);// 返回id为1、2、3的一组客户$customers = Customer::findAll([1, 2, 3]);// 返回所有状态为 "deleted" 的客户$customer = Customer::findAll([ 'status' => Customer::STATUS_DELETED,]);以数组形式获取数据有

[1] [2] [3] [4] [5] [6]  下一页


活动记录(Active Record): 活动记录对象关系映射(ORM),检索和操作记录、定义关联关系