分类 YII 下的文章

yii2基础知识总结

#1:开启 Schema 缓存,会节省两次查询,生成缓存文件;可以通过debug查看

'enableSchemaCache' => true,
'schemaCacheDuration' => 3600,
'schemaCache' => 'cache',

2:DAO的4种查询方法(Database Access Objects);建立在 PHP PDO 之上的数据访问层 (DAO)

  • queryAll
  • queryOne
  • queryScalar
  • queryColumn

3:DAO的插入,更新,删除

  • 插入:Yii::$app->db->createCommand()->insert('表名',[数据])->execute;(batchInsert批量插入)
  • 更新:Yii::$app->db->createCommand()->('表名',[数据],[条件])->execute;
  • 删除:Yii::$app->db->createCommand()->('表名',[条件])->execute;

4:查询生成器(Query Builder);查询构建器建立在DAO上,前提是必须先实例化一个对象$query = new query;

  • 查看构造后的语句,$query->createCommand()->sql;$query ->createCommand()->getRawSql();
  • from:from('user u') || from(['u'=>'user']),别名
  • select:不能不填参数,但是可以为空数组;以下是select的小技巧
1> 按需查找字段
2> 别名:select(['ID'=>'id','名字'=>'username'])
3> 拼接字段:select(['卡号'=>"CONCAT(id,'-',username)" ]),可以用一些mysql的函数
4> 查找字段数量:select("count(*)")
5> 唯一性:select("username")->distinct

5:查询构造器的where方法

三种参数方式

  • 字符串形式:where("id=2"),不推荐这样;可以where("id=:id")->addParams([":id"=>2]),where("id=:id", [":id"=>2])绑定参数,预防sql注入,参数化
  • 数组形式:where(['name'=>"lzc", 'id'=>[2,6]]),里面的[],相当于in;
  • 复杂的数组形式:where(["<>","name","12"])
  • orderBy最好也用数组形式,清晰明了

6:查询构造器的limit,offset,groupBy,Having

  • limit(2),从0到1
  • offset(1),从1开始,偏移一个,从第几个开始
  • groupBy([]),分组;$query->select(['user_total'=>"count(*)"])->groupBy(['province'])
  • having(['>','count(*)',1])

7:new ActiveDataProvider

8:AR的rules;可以查速查表validate

save之前会去自动验证;
language=>‘zh’,转换成中文;
if($model->save() == false){
    $model->getErrors();
};
规则模版['字段',‘规则’,‘message’=>'']
massage提示语;
自定义rule: 
1>:['username', function($attr,$params){
    if($this->attr == 'abei'){
        return true;        
    } else {
        return->addError('username', '你不等于lv,所以不能通过')
    }
}];
2>:通过使用匿名函数来自定义rule;
    ['字段',方法名称(只要方法名称就行)]
3>:或者自定义一个方法,来调用验证
    ['字段', 验证类名::classname()]

9AR关联

  • hasOne
  • hasMany
  • get(魔术方法)+自定义名字:直接掉这个自定义名字即可
  • return $this->hasMany():是个query对象,因为可以用query的方法,后面接

Active Record轻松学习

1:AR是一个类

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

2:连接数据库

  • ActiveRecord中有个方法:getDb

3:查询数据

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

  • var_dump(User::find()):【是个AR对象】返回的是yiidbActiveQuery这个对象;User::find()等价于ActiveQuery一个对象;ActiveQuery继承于yiidbQuery,所以能用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()后,可以用很多查询方法
  • 用属性查,除第一次,后面的都是差的缓存;用方法的话每次都得查询,并且对服务器的压力大一些