Yii2 - Active Record 轻松学习

1:AR是一个类

  • 继承 \yii\db\ActiveRecord
  • 自动生成后至少会有三个方法tableName, rules,
    attributeLabels
  • 数据库的操作小助手(操作的主要是属性和方法)

2:连接数据库

  • ActiveRecord中有个方法:getDb

3:查询数据

例子:User::find()->where([])->one();find()方法发生了什么,batch&each大数据查询优化

  • var_dump(User::find()):【是个AR对象】返回的是yii\db\ActiveQuery这个对象;User::find()等价于ActiveQuery一个对象;ActiveQuery继承于yii\db\Query,所以能用where等方法
  • 大数据优化查询,one方法最好也填上个limit方法

4:对数据的访问

  • 在model中什么是属性:业务数据
  • 获取所有属性:attributes获取所有字段名称及其值&attributes()只是获取字段名称
  • 获取旧的数据getOldAttributes():第一次读时的数据
  • 属性标签:attributeLabels是,getAttributeLabel,generateAttributeLabel

5:场景的意义:scenario方法

  • 在rules中 on设置场景,safe代表安全
  • rules规则
  • 块赋值,rules里的数据都可以:
    $model->attributes = [
    'username' => 123,
    'password' => 234,
    ]

6:保存数据那些事

  • save如何做到insert&update两个操作:$this->getIsNewRecord()变量来区分
  • save操作如何跳过数据验证:save(false)
  • 块赋值问题
  • 更新计数问题updateCounts

7:脏属性和加载默认值

  • 获取脏属性:$model->getDirtyAttributes()
  • 加载默认值:$model->loadDefaultValues()

8:批量更新和批量删除

  • Goods::updateAll(['key'=>'val'],[]);
  • Goods::updateAllCounters()更新计数
  • Goods::deleteAll()

9:ar对象的生命周期

  • 只针对AR对象 new

10:延迟加载和即时加载

  • 延迟加载:第一次查询完会缓存起来
  • 即时加载:
    $orders = Order::find()->all();
    foreach($orders as $order){
    $og = $order->orderGoods;(关联)循环里面会有很多查询,查询次数很多
    }
    解决方案:
    $orders = Order::find()->with('orderGoods')->all();
    foreach($orders as $order){
    $og = $order->orderGoods;(关联)
    }
    这样只会有两条查询,第二条会是in()这种方式来解决

11:关于JOIN查询

  • city表和user表关联

    第一种:
    $data = City::find()
    ->leftJoin("user",'city'.id = 'user'.city_id)
    ->with('user'):即时加载
    ->asArray()
    ->all()
    
    第二种:
    $data = City::find()
    ->joinWith('user')
    ->asArray()
    ->all()

12:反向关联,用的较少

  • 减少sql查询的冗余
  • inverseOf

13:关联中的link和unlink方法

14:额外字段

  • set和get

15:关联

  • 获取属性的关联:$model->admins,获得的是一个AR对象
  • 通过方法的形式调用关联:$model->getadmins(),获得是ActiveQuery,AQ是个查询集合,里面有很多查询构造器的方法;这就是为什么一个$model::find()后,可以用很多查询方法
  • 用属性查,除第一次,后面的都是差的缓存;用方法的话每次都得查询,并且对服务器的压力大一些
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!