‬yii2 如何使用数据库(二) 之使用ActiveRecord

原创 2018年04月16日 12:57:23

上一节我们讲到了CreatCommand数据库的方法,也说到了这种方法的优缺点这节,我们讲一下更为好用的上述两种方法

他们是什么?

ActiveRecord和QueryBulider是建立在DAO层基础上的,更为增强和常用的数据库访问方法。

ActiveRecord 介绍和用法

Active Record

Active Record (活动记录,以下简称AR)提供了一个面向对象的接口,用以访问数据库中的数据。
* 一个 AR 类关一张数据表,每个 AR 对象对应表中的一行。
* AR对象的属性,对应为数据行的列
* 可以直接以面向对象的方式来操纵数据表中的数据,这样就不需要写SQL语句就能实现数
据库的访问。

我们会在下面对这几个做出介绍

声明ActiveRecord类

通过继承 yii\db\ActiveRecord 基类来声明一个AR类,并实现tableName方法,返回与之相关联的数据表的名称。
这样就建立了一个关于table的AR类

如:

class Article extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'article';
    }
    ……

用AR类查询数据

AR 提供了两个静态方法来构建 DB 查询,并且把查询到的数据填充到 AR 对象实例里,最后返回这个对象。

yii\db\ActiveRecord::find()


 $model = ArticleStatus::find()->where(['id'=>1])->one();

find后面跟的where方法,它的参数就是查询条件id=1,根据查询条件,应该是会取得表中的第一条记录,one方法就会实际去执行查询,并用查询结果来填充一个AR类的实例对象。这个对象就是返回值,我们用变量model来保存,这就是和数据库表中id=1这条记录对应的一个ActiveRecord对象

可简写为

$model = ArticleStatus::findOne(1)
$model = ArticleStatus::findAll(['status'=>2])

同样我们可以在类参考手册里面看到
find()方法实现了ActiveQueryinterface这个接口,我们看看这个接口到底有些什么

Creates an yii\db\ActiveQueryInterface instance for query purpose.

我大概归类了一下

方法名称 用途
all() 、 one() 执行查询语句并返回查询结果AR对象
where()、orwhere()、andwhere() 查询条件
orderBy(),addOrderBy() 排序
count() 返回符合查询条件的记录数
limit() 去除查询结构的条数
with() 指定关联表的字段

yii\db\ActiveRecord::findBySql()

用sql语句查询,和CreateCommand()不同的是,他返回的是AR对象

得到AR类之后访问列数据

  1. 查询单个对象时的AR对象
$model = article::findOne(1);

echo $model -> id;
  1. 查询多个数据

错误:

$model = article::findAll(['status'=>2);

foreach($model as $item)
{
    echo $item->id;
}

我们上面的方法是用普通方法来把大量输入如(10万)用对象存储,这样无疑太浪费空间了。所以上面的方法要舍弃;

正确:

①假如我们要获取大量数据都用 对象来存储无疑非常的浪费内存 我们应该把对象转变为数组因为数组占用的资源要比对象小的多

$model = User::find()->where(['status'=>1])->asArray()->all();
        foreach($model as $item)
        {
            echo $item['id']; 
        }

② 我们在取大量数据时也要注意,可以一部分一部分的取,不全部取出

 foreach(User::find()->batch(2) as $item)   //一次取出两条数据出来存放到item里
        {
            ……//对两条数据进行操作
        }

操作数据CRUD

AR类提供了下面这些方法实现CRUD操作

方法名
yii\db\ActiveRecord::insert()
yii\db\ActiveRecord::delete()
yii\db\ActiveRecord::update()
yii\db\ActiveRecord::save()

1. Create

$article = new Article();
$article->title = '测试';
$article->content = '测试内容';
$article->save();  //等同于insert()
  1. Read
$article = Article::findOne(1);
  1. Update
$article = Article::findOne(1);
$article->title = "测试1";
$article->save(); //等同于update()
  1. Delect
$article = Article::findOne(1);
$article -> delect();

用ActiveRecord查询关联数据

我们操作数据库的时候经常会碰到需要联表查询的情况。 这时候我们就需要用到ActiveRecord的关联查询方法

写入关联关系

首先我们需要在控制器中写入关联关系,比如我要查询文章这个表,里面有个作者id,我需要联表查询,对应的作者名称。

那么我们就需要在models文件里用hasone或者hasmany方法。

如上:

一个文章属于一个作者,属于一对一所以在文章的model里面用hasone()方法

一个作者有多个文章那么就需要用到hasmany()方法

例:

  public function getAuthor()
    {
        return $this->hasOne(Admin::className(), ['id' => 'author_id']);
    }

当我们在控制器中输入 Arcticle->

graph LR
Admin::className-->提取出Admin这个模型类的表名

从AR对象中获得我们需要的值

然后我们所需要的作者名称就会加载我们的AR对象中。

echo $model->author->username;

就能得到我们的值

还有更多的AR类的操作可以去到 ActiveQueryInterface的类参考手册

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36172443/article/details/79959198

关于Yii2中redis扩展的使用

yii2支持了redis扩展,不需要在本地下载php的扩展库就可以很好的使用 1.下载windows的redis安装包打开cmd,进入安装包目录,使用redis-server.exe redis.c...
  • wyh09102010
  • wyh09102010
  • 2014-12-02 12:03:11
  • 3529

Yii2学习之ActiveRecord

简单介绍 常用操作 更改不同表 数据查询更改保存 批量查询
  • xiaog351
  • xiaog351
  • 2015-08-14 19:35:11
  • 2621

Yii2-使用ActiveRecord数据操作数据分页的记录重复问题

可能排序问题引起, 对于同等条件的排序如 orderId 都==0 最后再指定的能进一步区分orderId的字段来排序,如ID, 不一定要唯一,只要能对orderId=0 的记录组合排序...
  • xmlife
  • xmlife
  • 2016-09-01 12:10:03
  • 1167

Yii2 ActiveRecord 添加额外属性

如果你的Form表单中的属性有部分不是在数据库中,而你的Mode又集成了ActiveRecord,这时想通过$model->load()加载那部分未在数据库定义的属性可以重写attributes()函...
  • mrwu9902
  • mrwu9902
  • 2017-07-31 15:23:19
  • 527

yii2.0 基于ActiveRecord 封装的curd操作

基于yii2.0框架 ,对activeRecord 类进行了继承和封装,实现基本的curd、强制主从切换等方法,同时兼容ActiveRecord 的原生方法,一套好用的curd方法封装,可以作为mod...
  • wyfhist
  • wyfhist
  • 2017-09-02 17:06:14
  • 439

Yii2 数据库Active Record(ORM)

ACTIVE RECORD(ORM) 参考:http://www.yiiframework.com/doc-2.0/guide-db-active-record.html namespace app\...
  • hzqghost
  • hzqghost
  • 2015-03-07 17:04:42
  • 14544

YII2-数据查询Active Record方法

查询数据 AR 提供了两种方法来构建 DB 查询并向 AR 实例里填充数据: •[[yii\db\ActiveRecord::find()]] •[[yii\db\ActiveRecord::f...
  • xmlife
  • xmlife
  • 2015-06-12 14:52:35
  • 8303

深入理解 yii2的Active Record

深入理解 yii2的Active Record yii2 中的  $model->attribute()   ,  $model->attributes  ,   $model->attributes...
  • terry_water
  • terry_water
  • 2015-11-13 16:28:22
  • 3141

yii2中beforeDelete的方法

model关于使用parent的顺序 在里面添加EVENT时要在事件注册之后调用parent::beforeDelete(); 在常规情况下用官方的实例 使用.e.g /** ...
  • phpeav
  • phpeav
  • 2015-04-16 15:18:55
  • 997

Yii Active Record 动态数据表

Active Record(AR)是一种流行的 对象-关系映射(ORM)技术,其映射关系为 AR class:数据表AR class property:数据表的一列AR 实例:数据表的一条数据 所...
  • tuantuanls
  • tuantuanls
  • 2014-06-04 20:11:06
  • 1279
收藏助手
不良信息举报
您举报文章:‬yii2 如何使用数据库(二) 之使用ActiveRecord
举报原因:
原因补充:

(最多只允许输入30个字)