Yii框架记录
使用yii开发一段时间,发现自身知其形不知其意,重温了下yii,理解框架,也可以梳理自己的知识库,借鉴成长,阶段性总结如下:
模型
模型是MVC模式中的一部分,是表现业务数据规则和逻辑的对象。
可通过集成yii/base/Model或它的子类定义模型类,基类支持特性:
- 属性:表现业务数据,可以像普通类属性或数组一样被访问;
- 属性标签:指定属性显示出来的标签;
- 块赋值:支持一次给许多属性赋值;
- 验证规则:确保输入数据符合所申明的验证规则;
- 数据导出:允许模型数据导出为自定义的数组;
验证规则 调用yii/base/Model::validate()来验证接收的数据;
表单
yii/widgets/ActiveForm来创建表单。
<?php $form = ActiveForm::begin(['id' => 'user-form',action' => ['test/getpost'],'method'=>'post',]); ?>
<?=$form->field($model, 'username')->textInput(['maxlength' => 20]) ?>
<?=$form->field($model, 'password')->passwordInput(['maxlength' => 20]) ?>
<?=Html::submitButton('提交', ['class'=>'btn btn-primary','name' =>'submit-button']) ?>
<?php ActiveForm::end(); ?>
$model实现数据赋值 load方法
$model->load(yii::$app->request->post());
表单中存在一些与模型对象无关系、额外的HTML标签,可以使用纯html或者使用yii/helper/Html帮助类中的方法。
控制器 Controllers
refresh() 刷新页面。
render()
public string render( $view,$params=[] )
$params是传给视图的数据,通常传递模型对象,可以传递多个对象。
小部件 DetailView
DataView小部件用来显示数据。
<?= DetailView::widget(
[
'model' => $model,
'attributes' => [
'id',
'title',
'content:ntext',
'status',
'create_time:datetime',
[
'label' => '状态',
'value' => $model->status0
],
[
'attribute' => 'update_time',
'value' => date('Y-m-d H:i:s',$model->update_time)
]
],
'template' => '<tr><th style="width:120px;">{label}</th><td>{value}</td></tr>',
'option' => ['class'=>'table table-bordered detail-view'],
]
)=?>
ActiveRecord
通过继承yii\db\ActiveRecord基类来声明一个AR类,并实现tableName方法,返回与之相关联的数据表的名称
class User extends \yii\db\ActiveRecord{
public static function tableName(){
return 'user';
}
}
查询数据
返回AR对象
- yii\db\ActiveRecord::find()
$model = User::findone(1);
$model = User::findAll(['username'=>'张三']);
$model = User::find()->where(['username'=>'张三'])->all();
- yii\db\ActiceRecord::findBySql()
$sql = 'select * from user where username=\'张三\'';
$model = User::findSql($sql)->all();
操作数据CURD
- yii\db\ActiveRecord::insert()
- yii\db\ActiveRecord::update()
- yii\db\ActiveRecord::delete()
- yii\db\ActiveRecord::save()
关联查询 使用Relations
ActiveRecord类通过hasOne或hasMany来建立两个表的关联关系;
hasOne 多对一,一对一;hasMany 一对多;
class User extends ActiveRecord{
...
public function getAddress(){
return $this->hasMany(Address:className(),['uid'=>'id']);
}
...
}
数组助手类 Array Helper
- 获取列(getColumn)
$data = [
[
['id'=>'123','data'=>'abc'],
['id'=>'345','data'=>'edf']
]
];
$ids = ArrayHelper::getColumn($data,'id');
- 建立映射表
$result = ArrayHelpr::map($data,'id','name');
结果:
[
'123' => 'abc',
'345' => 'def'
]
- 重建数组索引
#按id建立索引【如果重复项,将覆盖前面的】
$result = ArrayHelper::index($data,'id');
#按id分组建立索引
$result = ArrayHelper::index($array, null, 'id');
/*举例
* [
* '123'=>[ 'id'=>'123','data'=>'a' ], ['id'=>'123','data'=>'b'],
*
* '8687'=>[ 'id'=>'8687','data'=>'a' ], ['id'=>'123','data'=>'b'],
* ]
*/
- 多维排序
ArrayHelper::multsort($data,['age','name'],[SORT_ASC,SORT_DESC]);
- HTML 编码和解码
$encode = ArrayHelper::htmlEncode($data);
$decode = ArrayHelper::htmlDecode($data);
- 合并数组
$result = ArrayHelper::merge($array1,array2);
- 对象转数组
$data = ArrayHelper::toArray($posts,[...]);
查询构建器 Query Builder
建立在DAO基础之上,创建程序化的、DBMS无关的SQL语句,并且创建的SQL语句,比原生的SQL更易读更安全。
查询构建器事例:
$rows = (new \yii\db\Query())
->select(['id','name'])
->form('user')
->where(['name'=>'张三'])
->orderBy('id')
->limit(10)
->indexBy('id')
->all();
select()方法
使用字符串或一个数组来指定需要查询的字段
$query->select('id,name')
$query->select(['id','name'])
$query->select('id as user_id,name')
$query->select(['CONTACT(first_name,' ',last_name) AS full_name','name'])
子查询
#SELECT 'id',(SELECT COUNT(*) FROM `user`) as `count` from `user`
$subQuery = (new Query())->select('count(*)')->from('post');
$query = (new Query())->select(['id','count'=>$subQuery])->form('post');
$subQuery = (new Query())->select('id')->from('user')->where('status=1'); $query->from(['u' => $subQuery]);
可以使用yii\db\Query::addSelect()方法来选取附加字段。
$query->select(['id','username'])->addSelect(['email']);
where()方法
- 字符串格式 'status=1'
- 键值对数组 ['status'=>1,'type'=>2]
- 操作符格式 ['like','name','test']
操作符 | where参数 | SQL语句 |
---|---|---|
and | ['and','id=1','id=2'] | id=1 AND id=2 |
or | ['or','id=1','id=2'] | id=1 OR id=2 |
in | ['id','in',[1,2,3]] | IN (1,2,3) |
between | ['between','id',1,10] | id BETWEEN 1 AND 10 |
like | ['like','name',['test','sample']] | name like '%test%' AND name like '%sample%' |
比较 | ['>=','id','10'] | id>=10 |
orderBy()方法
$query->orderBy([
'id' => SORT_ASC, //升序
'name' => SORT_DESC //降序
])
也可用字符串来声明。
$query->orderBy("id ASC,name DESC");
limit() 和 offset() 方法
用来指定SQL语句当中的limit和offset子句。
$query->limit(10)->offset(20);
groupBy() 和 having() 方法
$query->groupBy(['id','status']);
可通过addOrderBY()来为group by子句增加额外的字段。
$query->groupBy(['id','status'])
->addGroupBy('age')
having 类似
$query->having(['status'=>1])
可调用andHaving或者orHaving()方法来为HAVING增加额外的条件。
$query->having(['status'=>1])
->andHaving(['>','age','30'])
join() 和 union() 方法
$query->join('LEFT JOIN','post','post.user_id=user.id');
union()用来指定SQL语句中的UNION子句
$query1 = (new \yii\db\Query())
->select("id,category_id as type,name")
->form('post')
->limit(10);
$query2 = (new \yii\db\Query())
->select('id,type,name')
->form('post')
->limit(10);
$query1->union($query2);
yii\db\Query提供一整套用于不同查询的方法 :
method | description |
---|---|
all() | 返回一个由行组成的数组,每一行由名称和值组成的关联数组。 |
one() | 返回结果集的第一行 |
column() | 返回结果集的第一列 |
scalar() | 返回结果集的第一行第一列的标量值 |
exists() | 返回一个表示该查询是否包含结果集的值 |
count() | 返回COUNT查询的结果 |
sum() | 返回指定列的和值 |
average() | 返回指定列的平均值 |
max() | 返回指定列的最大值 |
min() | 返回指定列的最小值 |
indexBy() 索引查询结果
当调用all()方法时,希望使用一个特定的字段或者表达式的值来作为索引结果集数组。可在调用yii\db\Query::all()之前调用yii\db\Query::indexBy()方法。
附件 0.00KB
# update
updateAllCounters 用于数字类型,将值进行 累加 或者 累减
$count = 1, 就是加一
$count = -1, 就是减一
```
User::updateAllCounters(['sort' => $count], ['id' => 2]);
//update user set sort=sort+count where id=2
```