Yii-basic与advanced及SQL调用

下载版本basic与advanced区别

Codeception 测试 / /
功能 Basic advanced
Project 结构 / /
网站控制器 / /
用户登录/登出 / /
表单 / /
数据库连接 / /
命令控制台 / /
资源包 / /
Bootstrap / /
前后台应用 /
可用的 User 模型 /
用户注册和密码恢复

basic 和 advanced 都自带有一些基本功能,Home页面、登录/登出、和数据库连接等功能。但是,

  • basic 更适合新手,特别是刚刚接触 yii 的入门开发人员。
  • adavanced 随包自带两个应用:前台应用 frontend 和后台应用 backend,basic 中只有一个应用 web。advanced 将前台和后台分开,方便开发者直接基于这两个应用搭建有前后台的完整网站,并且可以为前后台分别绑定不同域名。所以,advanced 比 basic 稍微复杂一点,不适合新手,适合学过yii的。

参考链接: https://www.awaimai.com/600.html

Yii中,别名以 @ 开头,以区别于正常的文件路径和URL

Yii2.0-advanced细节捡取

入口文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http://127.0.0.1/index.php?r=index

/index.php: 指明请求入口的php文件
?r=index:指明请求的是IndexController控制器的默认方法(actionIndex)

入口index.php中,加载helper文件夹中function.php文件函数
require(_DIR_.'/../helper/function.php)

自定义辅助函数
function dd(){
echo "<pre>"
var_dump($data)
echo "</pre>"
die;
}

请求组件:get获取参数id

1
2
3
4
5
请求方法判断:$request->isPost或isGet
当前用户ip地址:$request->userIP

$request=\Yii::$app->request;
echo $request->get('id',1) 1为默认值,id没有则为1

请求组件:post获取,用户postman 模拟表单参数,body中form-data

1
2
3
$request=\Yii::$app->request;
$username= $request->post('username','n') n为默认值,username没有则为n
dd($username)

传参至视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
变量放入1个数组,将零散的数据组装在一个数组里面
$na=['nihao'=>'sdjhjh',
...]
data[
'username'=>'lalla',
...
'arr'=>[
'age' =>7,
...
]
'na'=>$na
]
return $this->rederPartial('index',$data)

视图
<?php echo $username ?>
<?php echo $arr['age'] ?>

可以用conpact()代替$data
return $this->rederPartial('index',compact('$na',''))
reder与rederPartial对比,会渲染父模板,并将内容嵌入,后者不渲染
父模板在views中的layouts目录,main.php文件(通用)

SQL调用:

框架本身拥有一些基类,比如ActiveRecord。创建的Article需要继承这个类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

查询全部数据
$data=Article::find()->all();
查询单条数据
$data=Article::find()->where('id'=>5)->all();
id>3
$data=Article::find()->where(['>',id',3])->all();
id在2和5之间 并变为数组输出(节约内存)
$data=Article::find()->where(['between',’id',2,5])->asArray()->all();
大量数据,每次取100条(默认)减轻内存压力
foreach(Article::find()->batch(2) as $article){
echo count($article),'-';
}


$article = new Article();
$article->title='XXXX';
$article->num=10;
$data=$article->insert();或->save();
查看属性值$article->attributes['id'];



update()或save()
updateAllCounters(['num'=>1])每次查看num+1


delete('id>:id and num<:num',[':id'=>13,':num'=>100]);deleteall

or的使用

1
2
3
$where='is_delete=:is_delete and type=:type and (digest || title like :keywords)';
$addparams=[':is_delete'=>0,':type'=>intval($type),':keywords'=>'%'.$keywords.'%'];
$news=$newsmodel->find()->where($where)->addParams($addparams);

关联

一对多:hasmany

1
2
3
$category=Category::findOne(1);
$article=$category->hasMany('app\models\Article',['cate_id'=>'id'])->all();
或$article=$category->hasMany(Article::className(),['cate_id'=>'id'])->all();

在模型中定义一对多 默认all()

1
2
3
4
5
6
7
8
9
10
class Category extend ActiveRecord{
public function getArticle()
{
$article=$this->hasMany('app\models\Article',['cate_id'=>'id'])->all();
return $article;
}
}
$category=Category::findOne(1);
$article=$category->getArticle();或取属性值->articles
all()二维数组one()一维

一对一:hasOne 默认one()

可以用with()替代循环,使它只需要一次sql查询,其中应用了join的原理

$articles=Article::find()->with(‘category’)->asArray()->all();

a标签发送post请求

1
2
3
4
5
6
7
use yii\web\UrlManager;
$urlManager = new UrlManager();

<a class="layui-btn layui-btn-normal" href="<?= $urlManager->createUrl(['caselist/create']) ?>">添加案例</a>


http://www.xiaochengfu.com/index.php/index/detail/aid/64.html

yii2-basic

1
2
3
4
5
6
7
8
9
10
11
12
13
14
├──assets    用来存放js和css文件
├──commands 包含控制台命令类
├──config 对yii2做基本配置
console.php 控制台应用配置信息
web.php Web 应用配置信息
├──controllers 存放控制器类
├──models 存放模型类
├──runtime 包含 Yii 在运行时生成的文件,例如日志和缓存文件
├──vender 包含已经安装的 Composer 包,包括 Yii 框架自身
├──views 视图目录,用于存放模板
├──web Web 应用根目录,包含 Web 入口文件
assets/ 包含 Yii 发布的资源文件(javascript 和 css)
index.php 应用入口文件
├──composer.json Composer 配置文件, 描述包信息

控制器的一些方法

1
2
3
4
5
6
7
8
重定向 $this->redirect([‘test/index’])
回到首页 $this->goHome()
返回 $this->goBack()
刷新当前页面 $this->refresh()
渲染视图 $this->render(视图,注入视图数组数据)
渲染没有layout的视图 $this->renderPartial(视图,注入视图数组数据)
响应Ajax请求,有layout的视图 $this->renderAjax(视图,注入视图数组数据)
修改Test控制器的index操作

例如:

1
2
3
4
5
6
7
8
TestController中调用return $this->render('index',['data'=>[1,2,3]]);
在@app\views\test\index.php中获取Test控制器注入的值

<?php
foreach ($data as $key => $value) {
echo $value."<br />";
}
?>

模型

模型在@app\models目录下模型类名与模型文件名同名,Model一般继承与两个yii2的类,一个是关联到数据库的yii\db\ActiveRecord,这个时候如果类名(文件名)不能与表直接对应,需要通过tableName()公共静态方法显式的指定表名,另一个是继承自yii\base\Model类。

sql调用与yii2-advance类似

模型继承AtiveRecord

AtiveRecord 是继承自Model的,Model有的ActiveRecord 都有。

Active Record (活动记录,以下简称AR)提供了一个面向对象的接口, 用以访问数据库中的数据。一个 AR 类关联一张数据表, 每个 AR 对象对应表中的一行,对象的属性(即 AR 的特性Attribute)映射到数据行的对应列。 一条活动记录(AR对象)对应数据表的一行,AR对象的属性则映射该行的相应列。 您可以直接以面向对象的方式来操纵数据表中的数据

Model 模型是 MVC 模式中的一部分, 是代表业务数据、规则和逻辑的对象。可通过继承 yii\base\Model 或它的子类定义模型类,Model用于一些没有操作数据库的模型,比如表单

如果你需要跟数据库打交道,那你继承ActiveRecord,否则,你继承Model,当然,由于AR继承自Model,所以它同样也支持Model的数据输入、验证等特性。并不是所有的模型都一定是操作数据库的