Yii Framework2.0开发教程(6)数据库mysql--ActiveRecord

jerry Yii2 2015年11月23日 收藏

Active Record(活动记录,以下简称AR)提供了一个面向对象的接口,用以访问数据库中的数据。

一个AR 类关联一张数据表每个 AR 对象对应表中的一行对象的属性(即 AR 的特性Attribute)映射到数据行的对应列

 一条活动记录(AR对象)对应数据表的一行,AR对象的属性则映射该行的相应列。 

您可以直接以面向对象的方式来操纵数据表中的数据,妈妈再不用担心我需要写原生 SQL 语句啦。

编辑models/Country.php

  1. <?php
  2.  
  3. namespace app\models;
  4.  
  5. use yii\db\ActiveRecord;
  6.  
  7. //你不用在里面写任何代码。只需要像现在这样,Yii 就能根据类名去猜测对应的数据表名。
  8. class Country extends ActiveRecord
  9. {
  10. }

或者

  1. <?php
  2.  
  3. namespace app\models;
  4.  
  5. use yii\db\ActiveRecord;
  6.  
  7. //你不用在里面写任何代码。只需要像现在这样,Yii 就能根据类名去猜测对应的数据表名。
  8. class Country extends ActiveRecord
  9. {
  10. //@return string 返回该AR类关联的数据表名
  11. public static function tableName()
  12. {
  13. return 'country';
  14. }
  15. }

编辑views/zhyoulun/helloworld.php

  1. <?php
  2. $country = new \app\models\Country;
  3. $country->code = 'ZZ';
  4. $country->name = 'Youlun';
  5. $country->population = '1';
  6. $country->save();
  7. ?>

访问网页http://localhost/basic/web/index.php?r=zhyoulun/helloworld,可以看到数据库中多了一条记录

查询数据

  1. // 获取 country 表的所有行并以 name 排序
  2. $countries = Country::find()->orderBy('name')->all();
  3. echo '<table border="1">';
  4. for($i=0;$i<count($countries);$i++)
  5. {
  6. echo '<tr>';
  7. echo '<td>'.$countries[$i]['code'].'</td>';
  8. echo '<td>'.$countries[$i]['name'].'</td>';
  9. echo '<td>'.$countries[$i]['population'].'</td>';
  10. echo '</tr>';
  11. }
  12. echo '</table>';
  1. // 用原生 SQL 语句检索客户:
  2. $sql = 'SELECT * FROM customer';
  3. $customers = Customer::findBySql($sql)->all();

以数组形式获取数据

  1. // 以数组而不是对象形式取回客户信息:
  2. $customers = Customer::find()
  3.     ->asArray()
  4.     ->all();
  5. // $customers 的每个元素都是键值对数组

批量获取数据

  1. // 一次提取 10 个客户信息
  2. foreach (Customer::find()->batch(10) as $customers) {
  3.     // $customers 是 10 个或更少的客户对象的数组
  4. }
  5. // 一次提取 10 个客户并一个一个地遍历处理
  6. foreach (Customer::find()->each(10) as $customer) {
  7.     // $customer 是一个 ”Customer“ 对象
  8. }
  9. // 贪婪加载模式的批处理查询
  10. foreach (Customer::find()->with('orders')->each() as $customer) {
  11. }

操作数据(AR 提供以下方法插入、更新和删除与 AR 对象关联的那张表中的某一行)

[[yii\db\ActiveRecord::save()|save()]]
[[yii\db\ActiveRecord::insert()|insert()]]
[[yii\db\ActiveRecord::update()|update()]]
[[yii\db\ActiveRecord::delete()|delete()]]

  1. // 插入新客户的记录
  2. $customer = new Customer();
  3. $customer->name = '詹姆斯';
  4. $customer->email = '007@example.com';
  5. $customer->save();  // 等同于 $customer->insert();
  6.  
  7. // 更新现有客户记录
  8. $customer = Customer::find($id);
  9. $customer->email = '邦德@demo.com';
  10. $customer->save();  // 等同于 $customer->update();
  11.  
  12. // 删除已有客户记录
  13. $customer = Customer::find($id);
  14. $customer->delete();

AR 同时提供了一下静态方法,可以应用在与某 AR 类所关联的整张表上。 用这些方法的时候千万要小心,因为他们作用于整张表! 比如,deleteAll() 会删除掉表里所有的记录。

[[yii\db\ActiveRecord::updateCounters()|updateCounters()]]
[[yii\db\ActiveRecord::updateAll()|updateAll()]]
[[yii\db\ActiveRecord::updateAllCounters()|updateAllCounters()]]
[[yii\db\ActiveRecord::deleteAll()|deleteAll()]]