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 协议》,转载必须注明作者和本文链接
推荐文章: