Yii2 数据库Active Record(ORM)

ACTIVE RECORD(ORM)

参考:http://www.yiiframework.com/doc-2.0/guide-db-active-record.html

  1. namespace app\models;
  2. use yii\db\ActiveRecord;
  3. class Customer extends ActiveRecord
  4. {
  5. const STATUS_ACTIVE = ‘active‘;
  6. const STATUS_DELETED = ‘deleted‘;
  7. public static function tableName()
  8. {
  9. return ‘customer‘;
  10. }
  11. public static function getDb()
  12. {
  13. return \Yii::$app->db2;  // use the "db2" application component
  14. }
  15. public static function init() //自定义初始默认数据
  16. {
  17. parent::init();
  18. $this->status = self::STATUS_ACTIVE;
  19. }
  20. }

访问数据列

[php] view plaincopy

  1. $id = $customer->id;
  2. $email = $customer->email;
  3. -------------
  4. $customer->email = ‘[email protected]‘;
  5. $customer->save();


查询数据

[php] view plaincopy

  1. $customers = Customer::find()
  2. ->where([‘status‘ => Customer::STATUS_ACTIVE])
  3. ->orderBy(‘id‘)
  4. ->all();
  5. $customer = Customer::find()
  6. ->where([‘id‘ => 1])
  7. ->one();
  8. $count = Customer::find()
  9. ->where([‘status‘ => Customer::STATUS_ACTIVE])
  10. ->count();
  11. $customers = Customer::find()->indexBy(‘id‘)->all();
  12. $sql = ‘SELECT * FROM customer‘;
  13. $customers = Customer::findBySql($sql)->all();
  14. // to return a single customer whose ID is 1:
  15. $customer = Customer::findOne(1);
  16. Customer::find()->where([‘status‘ => Customer::STATUS_ACTIVE])->limit(1)->one()
  17. //返回数组
  18. $customers = Customer::find()
  19. ->asArray()
  20. ->all();


批量返回

[php] view plaincopy

  1. // fetch 10 customers at a time
  2. foreach (Customer::find()->batch(10) as $customers) {
  3. // $customers is an array of 10 or fewer Customer objects
  4. }
  5. // fetch 10 customers at a time and iterate them one by one
  6. foreach (Customer::find()->each(10) as $customer) {
  7. // $customer is a Customer object
  8. }
  9. // batch query with eager loading
  10. foreach (Customer::find()->with(‘orders‘)->each() as $customer) {
  11. }

数据处理

  • save()
  • insert()
  • update()
  • delete()

批量数据处理

  • updateCounters()
  • updateAll()
  • updateAllCounters()
  • deleteAll()

[php] view plaincopy

  1. // to insert a new customer record
  2. $customer = new Customer();
  3. $customer->name = ‘James‘;
  4. $customer->email = ‘[email protected]‘;
  5. $customer->save();  // equivalent to $customer->insert();
  6. // to update an existing customer record
  7. $customer = Customer::findOne($id);
  8. $customer->email = ‘[email protected]‘;
  9. $customer->save();  // equivalent to $customer->update();
  10. // to delete an existing customer record
  11. $customer = Customer::findOne($id);
  12. $customer->delete();
  13. // to delete several customers
  14. Customer::deleteAll(‘age > :age AND gender = :gender‘, [‘:age‘ => 20, ‘:gender‘ => ‘M‘]);
  15. // to increment the age of ALL customers by 1
  16. Customer::updateAllCounters([‘age‘ => 1]);

数据效验

[php] view plaincopy

  1. $model = Customer::findOne($id);
  2. if ($model === null) {
  3. throw new NotFoundHttpException;
  4. }
  5. if ($model->load(Yii::$app->request->post()) && $model->save()) {
  6. // the user input has been collected, validated and saved
  7. }else{
  8. ;
  9. }

初始默认数据

[php] view plaincopy

  1. $customer = new Customer();
  2. $customer->loadDefaultValues();

生命与执行周期

初始化

[php] view plaincopy

  1. constructor
  2. init(): will trigger an EVENT_INIT event

调用 save()时

[php] view plaincopy

  1. beforeValidate(): //return bool
  2. afterValidate(): will trigger an EVENT_AFTER_VALIDATE event
  3. beforeSave(): will trigger an EVENT_BEFORE_INSERT or EVENT_BEFORE_UPDATE event
  4. perform the actual data insertion or updating
  5. afterSave(): will trigger an EVENT_AFTER_INSERT or EVENT_AFTER_UPDATE event

调用delete()删除时

[php] view plaincopy

  1. beforeDelete(): will trigger an EVENT_BEFORE_DELETE event
  2. perform the actual data deletion
  3. afterDelete(): will trigger an EVENT_AFTER_DELETE event

关联表数据

yii\db\ActiveRecord::hasMany() and yii\db\ActiveRecord::hasOne()

[php] view plaincopy

  1. class Customer extends \yii\db\ActiveRecord
  2. {
  3. public function getOrders()
  4. {
  5. // Customer has_many Order via Order.customer_id -> id
  6. return $this->hasMany(Order::className(), [‘customer_id‘ => ‘id‘]);
  7. }
  8. }
  9. class Order extends \yii\db\ActiveRecord
  10. {
  11. public function getCustomer()
  12. {
  13. // Order has_one Customer via Customer.id -> customer_id
  14. return $this->hasOne(Customer::className(), [‘id‘ => ‘customer_id‘]);
  15. }
  16. }
  17. class Customer extends \yii\db\ActiveRecord
  18. {
  19. public function getBigOrders($threshold = 100)
  20. {
  21. return $this->hasMany(Order::className(), [‘customer_id‘ => ‘id‘])
  22. ->where(‘subtotal > :threshold‘, [‘:threshold‘ => $threshold])
  23. ->orderBy(‘id‘);
  24. }
  25. }
  26. $orders = $customer->getBigOrders(200)->all();

中间关联表
via() or viaTable()

[php] view plaincopy

  1. class Order extends \yii\db\ActiveRecord
  2. {
  3. public function getItems()
  4. {
  5. return $this->hasMany(Item::className(), [‘id‘ => ‘item_id‘])
  6. ->viaTable(‘order_item‘, [‘order_id‘ => ‘id‘]);
  7. }
  8. }

贪婪模式

[php] view plaincopy

  1. // SQL executed: SELECT * FROM customer WHERE id=1
  2. $customer = Customer::findOne(1);
  3. // SQL executed: SELECT * FROM order WHERE customer_id=1
  4. $orders = $customer->orders;
  5. // no SQL executed
  6. $orders2 = $customer->orders;
  7. ------------
  8. $customers = Customer::find()->limit(100)->all();
  9. foreach ($customers as $customer) {
  10. // SQL executed: SELECT * FROM order WHERE customer_id=...
  11. $orders = $customer->orders;
  12. // ...handle $orders...
  13. }
  14. ---------------
  15. // SQL executed: SELECT * FROM customer LIMIT 100;
  16. //               SELECT * FROM orders WHERE customer_id IN (1,2,...)
  17. $customers = Customer::find()->limit(100)
  18. ->with(‘orders‘)->all();
  19. foreach ($customers as $customer) {
  20. // no SQL executed
  21. $orders = $customer->orders;
  22. // ...handle $orders...
  23. }
  24. -----------------------
  25. $customer = Customer::findOne(1);
  26. // lazy loading: SELECT * FROM order WHERE customer_id=1 AND subtotal>100
  27. $orders = $customer->getOrders()->where(‘subtotal>100‘)->all();
  28. // eager loading: SELECT * FROM customer LIMIT 100
  29. //                SELECT * FROM order WHERE customer_id IN (1,2,...) AND subtotal>100
  30. $customers = Customer::find()->limit(100)->with([
  31. ‘orders‘ => function($query) {
  32. $query->andWhere(‘subtotal>100‘);
  33. },
  34. ])->all();

联合查询关联表

[php] view plaincopy

  1. // join with multiple relations
  2. // find the orders that contain books and were placed by customers who registered within the past 24 hours
  3. $orders = Order::find()->innerJoinWith([
  4. ‘books‘,
  5. ‘customer‘ => function ($query) {
  6. $query->where(‘customer.created_at > ‘ . (time() - 24 * 3600));
  7. }
  8. ])->all();
  9. // join with sub-relations: join with books and books‘ authors
  10. $orders = Order::find()->joinWith(‘books.author‘)->all();
  11. class User extends ActiveRecord
  12. {
  13. public function getBooks()
  14. {
  15. return $this->hasMany(Item::className(), [‘owner_id‘ => ‘id‘])->onCondition([‘category_id‘ => 1]);
  16. }
  17. }
  18. // SELECT user.* FROM user LEFT JOIN item ON item.owner_id=user.id AND category_id=1
  19. // SELECT * FROM item WHERE owner_id IN (...) AND category_id=1
  20. $users = User::find()->joinWith(‘books‘)->all();
  21. // find all orders that contain books, but do not eager load "books".
  22. $orders = Order::find()->innerJoinWith(‘books‘, false)->all();
  23. // which is equivalent to the above
  24. $orders = Order::find()->joinWith(‘books‘, false, ‘INNER JOIN‘)->all()
  25. //额外条件
  26. class User extends ActiveRecord
  27. {
  28. public function getBooks()
  29. {
  30. return $this->hasMany(Item::className(), [‘owner_id‘ => ‘id‘])->onCondition([‘category_id‘ => 1]);
  31. }
  32. }

操作关系
link() and unlink()

[php] view plaincopy

  1. $customer = Customer::findOne(1);
  2. $order = new Order();
  3. $order->subtotal = 100;
  4. $customer->link(‘orders‘, $order);
  5. $customer->save();


Cross-DBMS

[php] view plaincopy

  1. // Relational database Active Record
  2. class Customer extends \yii\db\ActiveRecord
  3. {
  4. public static function tableName()
  5. {
  6. return ‘customer‘;
  7. }
  8. public function getComments()
  9. {
  10. // Customer, stored in relational database, has many Comments, stored in MongoDB collection:
  11. return $this->hasMany(Comment::className(), [‘customer_id‘ => ‘id‘]);
  12. }
  13. }
  14. // MongoDb Active Record
  15. class Comment extends \yii\mongodb\ActiveRecord
  16. {
  17. public static function collectionName()
  18. {
  19. return ‘comment‘;
  20. }
  21. public function getCustomer()
  22. {
  23. // Comment, stored in MongoDB collection, has one Customer, stored in relational database:
  24. return $this->hasOne(Customer::className(), [‘id‘ => ‘customer_id‘]);
  25. }
  26. }


过滤

[php] view plaincopy

  1. namespace app\models;
  2. use yii\db\ActiveQuery;
  3. class CommentQuery extends ActiveQuery
  4. {
  5. public function active($state = true)
  6. {
  7. $this->andWhere([‘active‘ => $state]);
  8. return $this;
  9. }
  10. }
  11. namespace app\models;
  12. use yii\db\ActiveRecord;
  13. class Comment extends ActiveRecord
  14. {
  15. /**
  16. * @inheritdoc
  17. * @return CommentQuery
  18. */
  19. public static function find()
  20. {
  21. return new CommentQuery(get_called_class());
  22. }
  23. }
  24. $comments = Comment::find()->active()->all();
  25. $inactiveComments = Comment::find()->active(false)->all();
  26. class Post extends \yii\db\ActiveRecord
  27. {
  28. public function getActiveComments()
  29. {
  30. return $this->hasMany(Comment::className(), [‘post_id‘ => ‘id‘])->active();
  31. }
  32. }
  33. $posts = Post::find()->with([
  34. ‘comments‘ => function($q) {
  35. $q->active();
  36. }
  37. ])->all();
  38. //默认
  39. public static function find()
  40. {
  41. return parent::find()->where([‘deleted‘ => false]);
  42. }

事务

[php] view plaincopy

  1. class Post extends \yii\db\ActiveRecord
  2. {
  3. public function transactions()
  4. {
  5. return [
  6. ‘admin‘ => self::OP_INSERT,
  7. ‘api‘ => self::OP_INSERT | self::OP_UPDATE | self::OP_DELETE,
  8. // the above is equivalent to the following:
  9. // ‘api‘ => self::OP_ALL,
  10. ];
  11. }
  12. }

[php] view plaincopy

    1. $model=Post::model();
    2. $transaction=$model->dbConnection->beginTransaction();
    3. try
    4. {
    5. // 查找和保存是可能由另一个请求干预的两个步骤
    6. // 这样我们使用一个事务以确保其一致性和完整性
    7. $post=$model->findByPk(10);
    8. $post->title=‘new post title‘;
    9. $post->save();
    10. $transaction->commit();
    11. }
    12. catch(Exception $e)
    13. {
    14. $transaction->rollBack();
    15. }
时间: 2024-10-09 19:49:47

Yii2 数据库Active Record(ORM)的相关文章

yii 数据库 Active Record

// 查找满足指定条件的结果中的第一行 $post=Post::model()->find($condition,$params); // 查找具有指定主键值的那一行 $post=Post::model()->findByPk($postID,$condition,$params); // 查找具有指定属性值的行 $post=Post::model()->findByAttributes($attributes,$condition,$params); // 通过指定的 SQL 语句查找

Yii2之Active Record

Yii AR很好很强大,但刚开始不知道怎么使用 如果英文不错,可以直接看原文地址http://www.yiiframework.com/doc/guide/1.1/en/database.ar 对于一个Model Post 有如下的4中查询方法,返回对象或者对象数组. // find the first row satisfying the specified condition $post=Post::model()->find($condition,$params);// find the

DAL、DAO、ORM、Active Record辨析

转自:http://blog.csdn.net/suiye/article/details/7824943 模型 Model 模型是MVC中的概念,指的是读取数据和改变数据的操作(业务逻辑).一开始我们直接把和数据库相关的代码放在模型里(sql直接写在代码中),这样就会导致以后的维护相当麻烦.业务逻辑的修改都需要开发者重新写sql,如果项目需要分库,需要将sql语句抽出来,放到单独的一层.这一层就是DAL(数据访问层). 持久层Persistence 持久层只是一个逻辑概念而已,主要任务是负责把

Yii2 : Active Record add Not In condition

$query = MyModel::find()->where(['not in','attribute',$array]); 參考 Yii2 : Active Record add Not In condition Adding a custom WooCommerce product type How to Set Up WooCommerce Demo Data 原文地址:https://www.cnblogs.com/fsong/p/11336900.html

Active Record (AR) 类及实现

Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术. 每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示表中的一行. 常见的 CRUD 操作作为 AR 的方法实现.因此,我们可以以一种更加面向对象的方式访问数据. 例如,我们可以使用以下代码向 tbl_post 表中插入一个新行. yii 表单验证规则 <?php classContactFormextendsCFormModel { public$_

Yii Active Record 动态数据表

Active Record(AR)是一种流行的 对象-关系映射(ORM)技术,其映射关系为 AR class:数据表 AR class property:数据表的一列 AR 实例:数据表的一条数据 所以对于常用的数据库操作(CRUD)可以转化成一种面向对象的数据操作形式. 实现一个AR类的的最简代码如下: class Post extends CActiveRecord { public static function model($className=__CLASS__) { return p

YII Active Record 详细解说

Active Record 虽然 Yii DAO 可以处理几乎任何数据库相关的任务, 但很可能我们会花费 90% 的时间以编写一些执行普通 CRUD(create, read, update 和 delete)操作的 SQL 语句. 而且我们的代码中混杂了SQL语句时也会变得难以维护.要解决这些问题,我们可以使用 Active Record. Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术. 每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 A

Yii的学习(4)--Active Record

摘自Yii官网:http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.ar 在官网原文的基础上添加了CDbCriteria的详细用法. 虽然 Yii DAO 可以处理几乎任何数据库相关的任务, 但很可能我们会花费 90% 的时间以编写一些执行普通 CRUD(create, read, update 和 delete)操作的 SQL 语句. 而且我们的代码中混杂了SQL语句时也会变得难以维护.要解决这些问题,我们可以使用 Active R

业务逻辑层-Active Record

Active Record(活动记录模式),当系统中的业务和数据库中的表存在一一对应关系的时候,可用采用. Active Record模式的特点:每个业务对象代表数据表中的一行数据,并且业务对象还包括了数据的增删改查的方法. ORM 一般这种模式采用一种ORM框架,即对象关系映射.这里用的的映射是:Dapper(开源轻量级,高效率,白自动化),Dapper需要我们写sql语法,所有是半自动化. 案例 内容管理系统中一博客系统 可以发布博客 对博客进行评论 code 代码下载 对象实体 publi