Yii框架记录

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帮助类中的方法。

附件 0.00KB

控制器 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
```


Yii框架记录的更多相关文章

  1. Yii 框架学习--01 框架入门

    Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...

  2. yii框架

    Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP框架之一.Yii是创始人 ...

  3. yii框架AR详解

    虽 然Yii DAO可以处理事实上任何数据库相关的任务,但很可能我们会花费90%的时间用来编写一些通用的SQL语句来执行CRUD操作(创建,读取,更新和删除). 同时我们也很难维护这些PHP和SQL语 ...

  4. YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

           YII 框架源码分析    百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...

  5. Yii框架下使用redis做缓存,读写分离

    Yii框架中内置好几个缓存类,其中有memcache的类,但是没有redis缓存类,由于项目中需要做主从架构,所以扩展了一下: /** * FileName:RedisCluster * 配置说明 * ...

  6. Yii框架zii.widgets.grid自定义按钮,ajax触发事件并提示

    相关类手册: http://www.yiichina.com/api/CButtonColumn   buttons 属性 public array $buttons; the configurati ...

  7. Yii框架tips(转)

    yii的一些小的技巧 http://www.yiichina.com/topic/151 db组件 'schemaCachingDuration'=>3600, 为什么不起做用?需要开缓存 如何 ...

  8. Yii框架tips

    db组件 'schemaCachingDuration'=>3600, 为什么不起做用?需要开缓存 如何在页面下边显示sql的查询时间在log组件的routes中加入 array('class' ...

  9. 与《YII框架》不得不说的故事—5篇目录

    与<YII框架>不得不说的故事—基础篇 第1章 课程目标 1-1 课程目标 (00:54) 第2章 课前知识准备 2-1 YII的启动和安装 (05:12) 2-2 YII请求处理流程 ( ...

随机推荐

  1. Oracle 通过子查询批量添加、修改表数据

    1.通过查询快速创建表 create table test1(id,job,mgr,sal) as () ) ---这是一个分页查询 ok,表创建成功 2.通过查询快速创建视图 create or r ...

  2. 关于80286——《x86汇编语言:从实模式到保护模式》读书笔记15

    一.80286的工作模式 80286首次提出了实模式和保护模式的概念. 实模式:和8086的工作方式相同: 保护模式:提供了存储器管理机制和保护机制,支持多任务. 二.80286的寄存器 (一)通用寄 ...

  3. HTML 三角符号

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Hibernate 多对多拆分 两个多对一

  5. Handling of asynchronous events---reference

    http://www.win.tue.nl/~aeb/linux/lk/lk-12.html 12. Handling of asynchronous events One wants to be n ...

  6. 学习笔记之--认识Xcode中的重要成员:lldb调试器

    之前对lldb调试器了解比较少,平时主要用来打印日志和暂定时用鼠标查看属性数据以及使用p po一些简单的命令语句. 今天看了一些关于lldb的文章,顿时觉得之前对它了解太少了,原来它还有那么多的功能. ...

  7. button小手设置 css的cursor

    需要对元素的css属性cursor进行设置.cursor可能的值: default 默认(通常是一个箭头) auto 默认.浏览器设置的光标 crosshair 十字线形状. pointer 小手形状 ...

  8. 将JavaScript语句插入HTML文档

    (1) 使用 <SCRIPT> 标签将语句嵌入文档 <script type="text/javascript"> function Que() { } & ...

  9. 预防XSS方法:HtmlEncode和JavaScriptEncode(转)

    XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入 ...

  10. java 类与对象基础整理

    之前学习javaSE的时候,没有针对性地对对类与对象的一些基础进行整理,下面这些内容是笔记内容整理后的,希望以后自己可以通过这些博客时常复习! 一.类and对象的基础 类似于类的生命啊,类与对象的关系 ...