Yii 2.0权威指南

本文是Yii 2.0的权威教程,涵盖应用结构、常用组件如美化路由和语言包配置,以及数据库操作,包括YiidbCommand的优缺点、ActiveRecord的使用和查询构建器的介绍。详细讲解了如何进行模型操作、数据CRUD、关联数据查询以及表单和小部件的使用,是学习Yii 2.0的全面参考资料。

各个Yii2.0框架下载链接:https://github.com/yiisoft/yii2/releases

一.应用结构

1.模型

模型是MVC模式中一部分,是代表业务数据,规则和逻辑的对象。

属性代表业务数据,每个属性是模型的公有可访问属性。

echo $model->getAttributeLabel('name');

当属性显示或获取输入时,经常显示属性相关标签。应用支持多语言的情况下,可翻译属性标签。

注:属性标签是 视图一部分,  但是在模型中声明标签通常非常方便,并可形成非常简洁可重用代码。

二.常用组件

1.美化路由(urlManager)

去掉index.php       配置component组件

参考文章:https://blog.youkuaiyun.com/lmjy102/article/details/53857520

2.语言包的配置

参考文章:http://www.yii-china.com/post/detail/177.html

3.上传图片组件: http://www.yii-china.com/post/detail/15.html
4.富文本编辑器组件 : http://www.yii-china.com/post/detail/03.html

三.数据库操作

var_dump($data); exit(0);  测试函数

创建一个yii\db\Command的对象,调用对象的方法来执行SQL查询,返回值是字符型的数组

$posts=Yii::$app->db->createCommand('SELECT * FROM post')->queryAll();

SQL语句还可以绑定参数

$posts=Yii::$app->db->createCommand('SELECT * FROM post

where id=:id AND status=:status')

->bindValue(':id',$_GET['id']);

->bindValue(':status',2);

->queryOne();

1.Yii\db\command的优缺点
1>.简单,只需要处理SQL语句和数组即可
2>.高效,通过SQL语句来查询数据库非常高效

1>.不同数据库系统的SQL语句会有些差别,因此无法做到代码适用于多种数据库系统
2>.用数据,没有用到面向对象的方式来管理数据,代码难维护
3>.如果不小心,会留下SQL注入这种不安全的因素

 

1.ActiveRecord

ActiveRecord(活动记录,简称AR类)提供了一套面向对象的接口,用以访问数据库中的数据。

1》一个AR类关联一张数据表,每个AR对象对应表中的一行

2》AR对象的属性,对应为数据库中的列

3》可以直接以面向对象的方式来操纵数据表中的数据,这样就不需要写SQL语句就能实现数据库的访问。

2.声明ActiveRecord类

通过继承yii\db\ActiveRecord基类来声明一个AR类,并实现tableName方法,返回与之相关联的数据表的名称。

Class Post extends \yii\db\ActiveRecord{

      Public static function tableName(){

           Return ‘post’;

}

}

3.查询数据

AR提供了两种方法来构建DB查询,返回AR对象,

*Yii\db\ActiveRecord::find()静态方法

$model=Post::find()->where(['id'=>32])->one();

等价于Post::findOne(32);

$models=Post::find()->where(['statue'=>32])->all();

等价于Post::findAll([statue=>32]);

$models=Post::find()->where(['AND'[status=>1],[author_id=>1],[Like,title,yii2]])->all();

 

*Yii\db\ActiveRecord::findBySql()

$sql=’SELECT  *  FORM  post  where  status=1’;

$posts=Post::findBySql($sql)->all();

ActiveQueryInterface常用方法

All() one()执行查询,并返回AR对象

Where() orWhere() andWhere() 查询条件

 

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

[‘in’,’id=1’,[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() addOrderBy()  排序

Count() 返回符合查询条件的记录数

Limit() 取出查询结果的条数

With() 指定关联表的字段

4.访问列数据

AR对象的属性,对应为数据行的列

   $model=Post::findOne(1);

   echo $model->id;

 

   $model=Post::findAll([‘status’=>1]);

   foreach($models as $item){

     echo $item->id;

}

5.操作数据CRUD

AR提供下面的这些方法来实现插入,更新和删除等功能:

Create

$customer=new Customer();

$customer->name=’James’;

$customer->save();//等同于$customer->insert()          Yii\db\ActiveRecord::insert()   

Read

$customer=Customer::findOne($id)

Update

$customer=Customer::findOne($id);

$customer->name=’jame’;

$customer->save(); //等同于$customer->update()     Yii\db\ActiveRecord::update()   

Delete

$customer=Customer::findOne($id);

$customer->deletle();

Yii\db\ActiveRecord::save()自己可以判断是更新还是删除

6.查询关联的数据

ActiveRecord类通过hasOne或hasMany方法来建立两个表的关联关系

hasOne用于多对一,一对一的情况,hasMany用于一对多的情况

建立关联关系后,就可以像访问自己的列数据一样便捷地去访问关联表的数据

Common/models/Post.php

Public function getStatus0(){

   return $this->hasOne(Poststatus::className(),[‘id’=>’status’]);

}

Public function getComments(){

   Return $this->hasMany(Comment::className(),[‘post_id’=>’id’]);

}

$thePost->status0->name;

$thePost->comments;

《  

表单它能把模型和表单结合到一起,简化了表单input元素的html代码编写,还充分利用了模型的数据规则,极大的减轻了表单开发的工作量,同时让表单代码的可读性和可维护性大大提高。

---ActiveField对象的使用

<?=$form->field($model,’password’)->password()?>

<?=$form->field($model,’username’)->textInput()->

hint(“Please enter your name”)->label(‘Name’)?>

<?=$form->field($model,’email’)->input(‘email’)?>

---额外的标签的处理

表单中,存在一些和模型对象没有关系的、额外的HTML标签,比如submitButton我们可以:

---使用纯HTML

使用yii\helpers\Html帮助类中的方法来添加到表单中

四.小部件DetailView

1.数据小部件

Yii提供了一套数据小部widgets,这些小部件可以用于显示数据。

*DetailView小部件用于显示一条记录数据

*ListView和GridView小部件能够用于显示一个拥有分页,排序和过滤功能的一个列表或者表格

2.DetailView

用来显示一条记录的详情。下面这些都是一条记录的情况:

*一个Model模型类对象的数据

*ActiveRecord类的一个实例对象

*由键值对构成的一个关联数组

3.DetailView的创建

*调用DetailView::widget方法

*model这里可以是一个模型类的实例,可以是一个数组

*attributes属性决定显示模型的哪些属性以及如何格式化

4.DetailView的自定义设置

*经常用attribute和value来分开展示属性的标签和属性的值

*可以指定数据的展示格式

* [
                'class' => 'yii\grid\ActionColumn',
                'buttons' => [
                    'view' => function($url, $model, $key) {
                        return Html::a('查看', $url);
                    },
                    'update' => function($url, $model, $key) {
                        return Html::a('编辑', $url);
                    },
                    'delete' => function($url, $model, $key) {
                        $options = [
                            'data-pjax' => 0,
                            'data-confirm' => '您确定要删除此项吗?',
                            'data-method' => 'post',
                        ];
                        return Html::a('删除', $url, $options);
                    }
                ],
            ],

*template和option

DetailView::widget([

‘model’=>$model;

‘attribute’=>[

    ‘id’,

    ‘title’,

    ‘content:ntext’,

    ‘tags:ntext’,

    //’status’,

   [

‘label’=>’状态’,

‘value’=>$model->status0->name,

],

‘create_time:datetime’,

‘update_time:datetime’,

//’author_id’

[

‘attribute’=>’author_id’,

‘value’=>$model->author->nickname;

],

],

‘template’=>'<tr><th style="width:120px;">{label}</th><td>{value}</td></tr>'

//数据适应行

'options'=>['class'=>'table table-striped table-border detail-view'],

])

五、下拉菜单dropDownList()

<option value=”1”>草稿</option>  1为键,草稿为值

硬编码  <?=$form->field($model,’status’)->dropDownList([1=>’草稿’,2=>’已发布’],

[‘prompt’=>’请选择状态’]);?>

数据库获取第一种方法:<?php$psObjs=Poststatus::find()->all();

                      $allStatus=ArrayHelper::map($psObjs,’id’,’name’);?>

<?=$form->field($model,’status’)->dropDownList($allStatus,[‘prompt’=>’请选择状态’]);?>

数据库获取第二种方法:

<?php$psObjs=Yii::$app->db->createCommand(‘sql’);

                      $allStatus=ArrayHelper::map($psObjs,’id’,’name’);?>

<?=$form->field($model,’status’)->dropDownList($allStatus,[‘prompt’=>’请选择状态’])?>

六、数组助手类Array Helper

---什么是数组助手类

   Yii数组助手类提供了额外的静态方法,让你更高效地处理数组。

---获取值(getValue)

Class User{ public $name=’Alex’;}

  $array=[  ‘foo’=>[  ‘bar’=>new User(), ]  ]

《PHP》  $value=isset($array[‘foo’][‘bar’]->name)?$array[‘foo’][‘bar’]->name:null;

《Array Helper》    $value=ArrayHelper::getValue($array,’foo.bar.name’);

---获取列(getColumn)

   从多维数组或对象数组中获取某列的值。

   $data=[ [‘id’=>’123’,’data’=>’abc’],[‘id’=>’345’,’data’=>’def’] ,];

   Array Helper  $ids=ArrayHelper::getColumn($data,’id’);   结果:[‘123’,’345’]

---建立映射表(map)

可以使用map方法从一个多维数组或一个对象数组中取出数据,建立一个映射表(键值对数组),在map方法的参数列表中指定了欲构建的映射表的键名和值。

$array=[

   [‘id’=>’123’, ’name’=>’aaa’, ’class’=>’x’],

   [‘id’=>’124’, ’name’=>’bbb’, ’class’=>’x’],

   [‘id’=>’315’, ’name’=>’ccc’, ’class’=>’y’],

]

Array Helper $result=ArrayHelper::map($array,’id’,’name’);

结果:[ ‘123’=>’aaa’,‘124’=>’bbb’,‘315’=>’ccc’,]

七、Html帮助类

---解决什么问题

通过字符串连接来生成动态的HTML会很容易变得凌乱。

<?=’<p class=”username”>’.$user->name.’</p>’;?>

---什么是Html帮助类

HTML帮助类提供了很多静态方法,这些方法可以根据参数不同,生成各种HTML标签的代码,包括这些标签的属性和内容。

<?=’<p class=”username”>’.$user->name.’</p>’;?>

<?=Html::tag(‘p’,Html::encode($user->name),[‘class’=>’username’])?>

<?=<button type=”submit” class=”btn btn-primary” name”contact-button”>Submit</button>’?>

<?=Html::submitButton(‘Submit’,[class=”btn btn-primary” name”contact-button”])?>

---参考权威指南

   权威指南列出许多种HTML帮助类的静态方法,可以用来生成各种HTML代码。

八、查询构建器QueryBuilder

1、什么是查询构建器

查询构建器也是建立在DAO基础之上,可让你创建程序化的、DBMS无关的SQL语句,并且,这样创建的SQL语句,比原生的SQL语句更容易读、更安全。

2、使用查询构建器的步骤

---构建查询。创建一个yii\db\Query对象来代表一条SELECT SQL语句,然后通过调用一套可以串起来的方法,比如select方法,from方法,where方法等这些方法,构建出可以满足一定要求的查询条件。

---执行查询。执行yii\db\Query的一个查询方法从数据建库当中检索数据,例如:all(),one(),column()等这些查询方法。

$rows=(new\yii\db\Query())->select([‘’id,’email’])->from(‘user’)->where([‘last_name’=>’Smith’])->orderBy(id)->limit(10){构建查询}

->indexBy(id)->all();{执行查询}

添加分组条件

表的连接查询

界面测试输出数据(格式化输出数据)

echo "<hr><pre>"; print_r( $psObjs);echo "</pre>";exit(0);

   

数据库获取第一种方法:

<?php  $psObjs=Poststatus::find()->all();

                      $allStatus=ArrayHelper::map($psObjs,’id’,’name’);?>

<?=$form->field($model,’status’)->dropDownList($allStatus,[‘prompt’=>’请选择状态’]);?>

数据库获取第二种方法:

<?php    $psObjs=Yii::$app->db->createCommand(‘sql’);

                      $allStatus=ArrayHelper::map($psObjs,’id’,’name’);?>

<?=$form->field($model,’status’)->dropDownList($allStatus,[‘prompt’=>’请选择状态’])?>

数据库获取第三种方法:

<?php  $allStatus=(new \yii\db\Query())

->select([‘name’,’id’])

->from(‘poststatus’)

->indexBy(‘id’)

->column();?>

<?=$form->field($model,’status’)->dropDownList($allStatus,[‘prompt’=>’请选择状态’])?>

数据库获取第四种方法:

<?php  $allStatus=Poststatus::find()

->select([‘name’,’id’])

->indexBy(‘id’)

->column();?>

<?=$form->field($model,’status’)->dropDownList($allStatus,[‘prompt’=>’请选择状态’])?>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Yii 2.0 权威指南 本教程的发布遵循 Yii 文档使用许可. 版权所有 2014 (c) Yii Software LLC. 介绍 已定稿 关于 Yii 已定稿 从 Yii 1.1 升级 入门 已定稿 安装 Yii 已定稿 运行应用 已定稿 第一次问候 已定稿 使用 Forms 已定稿 玩转 Databases 已定稿 用 Gii 生成代码 已定稿 更上一层楼 应用结构 已定稿 结构概述 已定稿 入口脚本 已定稿 应用 已定稿 应用组件 已定稿 控制器(Controller) 已定稿 视图(View) 已定稿 模型(Model) 已定稿 过滤器 已定稿 小部件(Widget) 已定稿 模块(Module) 已定稿 前端资源(Asset) 已定稿 扩展(extensions) 请求处理 已定稿 运行概述 已定稿 引导(Bootstrapping) 已定稿 路由(Route)引导与创建 URL 已定稿 请求(Request) 已定稿 响应(Response) 已定稿 Sessions(会话)和 Cookies 已定稿 错误处理 已定稿 日志 关键概念 已定稿 组件(Component) 已定稿 属性(Property) 已定稿 事件(Event) 已定稿 行为(Behavior) 已定稿 配置(Configurations) 已定稿 类自动加载(Autoloading) 已定稿 别名(Alias) 已定稿 服务定位器(Service Locator) 已定稿 依赖注入容器(DI Container) 配合数据库工作 编撰中 数据访问对象(DAO) - 数据库连接、基本查询、事务和模式操作 编撰中 查询生成器(Query Builder) - 使用简单抽象层查询数据库 编撰中 活动记录(Active Record) - 活动记录对象关系映射(ORM),检索和操作记录、定义关联关系 编撰中 数据库迁移(Migration) - 在团体开发中对你的数据库使用版本控制 待定中 Sphinx 待定中 Redis 待定中 MongoDB 待定中 ElasticSearch 接收用户数据 编撰中 创建表单 已定稿 输入验证 编撰中 文件上传 待定中 多模型同时输入 显示数据 编撰中 格式化输出数据 待定中 分页(Pagination) 待定中 排序(Sorting) 编撰中 数据提供器 编撰中 数据小部件 编撰中 主题 安全 编撰中 认证(Authentication) 编撰中 授权(Authorization) 编撰中 处理密码 待定中 客户端认证 待定中 安全领域的最佳实践 缓存 已定稿 概述 已定稿 数据缓存 已定稿 片段缓存 已定稿 分页缓存 已定稿 HTTP 缓存 RESTful Web 服务 已定稿 快速入门 已定稿 资源 已定稿 路由 已定稿 格式化响应 已定稿 授权验证 已定稿 速率限制 已定稿 版本化 已定稿 错误处理 已定稿 测试
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值