视图和 模板
视图view :为用户展示界面 通常的view层是一个界面 为用户展示数据
在index的控制器中 return view() 这个时候默认返回的index模块中view中的index.html 如果这个文件不存在就会报错
return view() ;
参数 第一个是访问的路径 view()方法中可以添加参数 例如 view("upload") 就会去找view中的upload的文件 不传默认是view中的index
参数 第二个参数是我们传递的值 是一个数组的形式 在目标文件中 我们可以使用{$参数名} 来接受
view中接受的参数 {$a} 为什么可以使用大括号来接受呢?在配置文件中,配置了开始标签{和结束标签},有这2个标签可以自定识别他转换为对用的php
代码,这个配置是可以改变的,{ } 这个里面接受$a变量的时候左右是不可以有空格的,配置文件中也定义了可以使用这个接受一些常量,还有我们也可以使用这个
调用系统变量,比如Servier中一些信息,还可以获取请求中的一些值,还有cookie session
view中接受的变量是可以再次调用方法来执行一些操作的,方法的操作是 |来跟上方法名来处理的
{$a|方法名} 这样直接调用时默认的方法的第一个参数是$a 但是如果方法的参数有好几个,变量的位置不在第一个怎么办?
我们就使用站位的方式 {$a|方法名='参数1','参数2',###} 使用三个#号来占位这个方法对应的位置
另外,这个变量是可以参与计算的{$a+$b}的方式直接计算
在HTML中,使用的注释<!--注释文字--> 我们可以使用模板注释 {/*这里是view的注释*/},这样查看源码的的方式是看不到注释的
还可以这样用
可以使用$this->fetch() / $this->fetch("目标路径") 的方式,使用这个方法的好处是可以使用 $this->assign('a',100);的方式来传递值
使用$this->fetch()这个方法需要注意的是 use think\Controller 然后使用继承Controller
这样就还有一个方法,但是不计划使用 $this->display()方法 使用的参数是一样的 和上面这个是一样的 ,但是不用传递第一个参数,第一个参数是指定访问的路径文件,上面那个不传有默认的view,但是不存在就会报错, 这个是不需要存在的,因为他已经和view中的index没什么关系了,脱离了 MVC框架的设计 ,所以不用他,代码多了维护的成本比较大
控制器中向view中就是HTML中传递值的过程,{$a}的方式来接受变量值
_STATIC_ _JS_ _CS_
模板的循环标签
我们可以在控制器中直接传递list过来
在view中怎么接受呢 volist
{volist name='lsit' id='vo'}
上面的name就是传递值使用的key 这是一个循环的标签,把每个值依次赋值在id='vo'中
我们可以通过vo来取值 id就是指定变量值的
<p>{$vo.name}</p> 引用vo 直接输出每个vo中的名字属性
{/volist}
//高级用法
我们可以继续指定offset=2 就是说我们需要从数组的第2个索引位置开始遍历
length可以指定长度 mod='2' 拿到当前的位置来对2取余,这个我想到了在android中设置列表适配的时候
我们会对2取余来判断当前的位置,在商品列表的那个地方,显示的第一个和第二个的view有点不一样,android中
是拿到适配器中当前位置的position来取余的,这里更简单,一般用来列表排版
如果;list为空,我们是可以在加上一个empty="没有数据"
empty是不能直接使用标签的,但是他可以接受的是一个变量,我们可以传递过来一个标签
$empty="<p>空的数据</p>"
然后直接在empty="$empty"
我们也可以使用php模板
在上面直接定义 {php}$empty ="这里直接使用html的标签";{/php} 或者直接使用php的写法
<?php $empty ="这里直接使用html的标签"; ?>这样也是可以的
{volist }
这个中间还有一些内置的变量
$i 当前的索引位置 这个是默认的,但是如果有冲突我们是可以定义它的 在{volist key="s"}
然后$s 就是替换了$i的功能 ,其实不写就是默认的key='i'
{/volist}
foreach标签
//基本用法
{foreach $lsit as $vo}
<p>{$vo.name}</p>
{/foreach}
//更加深入的使用
{list name='list' item='vo'}
<p>{$vo.name}</p>
{/foreach}
这个是和上面的效果一样的
for 循环
{for start="1" end="10"}
<p>{$i} </p>
{/for}
每次+2
{for start="1" end="10" step="2"}
<p>{$i} </p>
{/for}
里面的$i是可以换的 name="k"
{$k}
可以在建立循环的列表
<ul>
{for start="1" end="10" }
<li>$i</li>
{/for}
</ul>
比较的标签
{eq name='a' value='10'} ///////value='$b'
//这里是比较的相同的时候
{else/}
//不相同的时候
{/eq}
上面的就是一个判断的标签 还有一个 equal 和eq一样样的
对应的标签是neq notequal
上面的判断是相同的或者不相同的情况
判断> gt >= egt
判断< lt <= elt
怎么判断多次呢?条件判断标签 就是使用switch
{switch name="Think.get.level"}
{case value="1"}<p>一级 <p> {/case}
{case value="2"} <p>2级 <p> {/case}
{case value="3"} <p>3级 <p> {/case}
{case value="4"} <p>4级 <p> {/case}
{/switch}
格式化后张这样
{switch name="Think.get.level"}
{case value="1"}<p>一级
<p> {/case}
{case value="2"}
<p>2级
<p> {/case}
{case value="3"}
<p>3级
<p> {/case}
{case value="4"}
<p>4级
<p> {/case}
{default /}
<p>游客</p>
{/switch}
{range name='' value='1,100' type='in' }范围的判断;这里注意的是type = in notin between包含其实和结束值的 notbetween
{defined name=''}判断某一个值是否定义
if标签 {if condition='($Think.get.level==1) AND (第二个条件)'}//定义条件
模板的布局 包含和继承 以后再看一次
模型篇
数据库操作 thinkPHP模型(对db进行了又一次的封装)
数据库的链接操作
use think\Controller;
use think\Db;
继承Controller
Db::connect();这里其实并没有进行链接 只是惰性加载 只有在执行具体额操作的时候才会进行连接
这里的参数可以可以传递一个数组进行配置
查询数据
选择表 我们可以使用table的方法和name方法 使用name的方法我们可以不需要添加数据库的前缀,如果有前缀并且数据库配置中配置了前缀
这里是用table 或者是 name 使用name是可以直接传递数据的名字,而不是加上配置文件中配置的前缀的
是使用table切必须添加前缀的
使用name其实是自动去配置文件找有没有前缀的,然后添加上去的
查询sql
$res = Db::query('select * from user where id=?', [1]); 第二个参数对应第一个参数中的? 位置一一对应
select
$res = Db::table('user')->select(); 使用table的方法选择数据库
$res = Db::table('user')->where(["id" => 10])->select(); 可以添加条件
返回结果是二维数组,如不存在返回一个空的数组
find
$res = Db::table('user')->where(['id'=>1 ])->find();
使用find 方法 返回的结果是一个1维数组
这个方法只返回一条记录 在这里我们需要添加where条件 如果结果不存在 返回的是一个null值
如果没有条件,默认排序是id最小的
value
$res= Db::table('user')->value('name');
我们想得到数据库某个字段的值 也可以加where条件 只返回一条数据 如果结果不存在 返回null
column
$res = Db::table('user')->column('password', 'name'); name就是对应的key值
查询这一列的数据 返回的是一个一维数组 可以传递2个参数 如果存在
第二个参数对应的就我们查询出来结果的key值 也是可以添加条件的
如果结果不存在 返回的是空数组
添加数据
/**
* 定义变量 选中数据库的一张表
*/
提前选择数据表 $db = Db::name('user');
insert 返回值是插入记录的条数
$db->insert([ 'name' => $key,
'password' => md5($key)
]);
返回值是插入记录的条数
insertGetId 返回的结果是插入数据的自增id
$res = $db->insertGetId([
'name' => $key,
'password' => md5($key)
]);
返回的结果是插入数据的自增id
insertAll
/**
* 添加数据: insertAll
* 多条数据
* 传递的参数是一个数组
* 返回插入数据成功的函数
* 我们可以拿着个返回的行数和数据的长度做比较,然后判断数据是不是全部插入了
*/
$data = [];
for ($i = 0; $i < 10; $i++) {
$key = '';
for ($ii = 0; $ii < 11; $ii++) {
$key .= $pattern{mt_rand(0, 9)}; //生成php随机数
}
$data[] = [
'name' => $key,
'password' => md5($key)
];
}
//准备好数据了
$res = $db->insertAll($data);
数据更新
$db = Db::name('user');
update
/**
* 更新数据: update
* 这个更新方法必须添加where条件
* 返回的结果是更新的条数
* 如果没有更新,则返回0
*/
$res = $db->where([
'id' => 1
])->update([
'name' => '13810916949'
]);
setField
/**
* 更新数据: setField
* 上面那个方法可以更新多个字段
* 如果我们只是简单的更新一个字段的时候
* 可以使用setField方法
* 返回值是影响的行数
* 没有被影响返回0
*/
$db->where(['id' => 2])->setField('name', '13546123446');
setInc
/**
* 更新数据: setInc
* 自增 这个id下的num字段每次自增1
* 可以传递第二个参数指定每次增加的数
* 返回值的影响数据的行数
*/
$db->where(['id' => 3])->setInc('num');
setDec
/**
* 更新数据: setDec
* 和setInc方法一样,自减
*/
$db->where(['id' => 4])->setDec('num');
数据库删除
$db = Db::name('user');
delete
/**
* 删除数据: delete
* 返回受影响的行数
* 当没有删除数据的时候返回的是0
* 如果删除的条件是主键 不需要where 直接在delete方法中传入参数主键
*/
$res = $db->where(['id' => 1111])->delete();
条件构造器
/**
* 条件构造器
*/
public function sqlbuild(){
$db = Db::name('user');
/**
* EQ =
* NEQ <>
* LT <
* ELT <=
* GT >
* EGT >=
* BETWEEN BETWEEN * AND *
* NOTBETWEEN NOTBETWEEN * AND *
* IN IN (*,*)
* NOTIN NOT IN (*,*)
*/
/**
* 可以连续添加where
* 第二个可以使用whereor方法
*/
$sql= $db->where(
[
'id' => ['EGT',1]//条件是id>=1
]
)->buildSql();
}
总结
数据库的操作无外乎就是增删改查
1. 数据库的连接在thinkPHP中也是很简单的
Db::connection方法是可以直接连接数据库的
这个方法我们一般不使用,因为当我们执行其他的操作方法的时候,它会自动连接好了
2. 在操作数据之前我们使用Db::name(表名) 这个方法来选择我们要操作的数据库表 ,这个返回的对象我们是可以直接操作的,另外还有一个table的方法
,这个方法需要传入的表名必须要添加前缀的,如果配置了前缀,使用name的方法会自动添加上前缀的名字
3. 增:
就是插入的方法 insert
参数是一个对象的数组形式 [
'name'=>'',password=>''
] 这个方法的返回值是插入记录的条数
还有一个insertGetid
这个方法操作是和上面的方法一样的额,返回值是操作的id
还有一个insertAll方法,这个方法一般用来插入多条的数据 ,传入的参数是一个数组,返回的数据是插入的条数,我们可以拿着这个条数来判断当前的数据库是不是完全插入了数据
和数据源做比较长度
4. 删:
删除相对来说就比较简单了一点就delete方法 ,这个方法注意的是要添加条件
5. 改:
就是执行数据库的更新操作 update
简单的执行更新一条数据,我们添加where条件和一个要改变的参数就可以 $res = $db->where([
'id' => 1
])->update([
'name' => '13810916949'
]);
我们还可以更新某个字段 setField $db->where(['id' => 2])->setField('name', '13546123446');
也是比较简单的,返回的是影响的行数,没有被修改直接返回0
6. 查:
数据库的查询操作:select
单一的一个结果查询,适应的方法是find 这个方法返回的是一个一维数组,查不到就返回空数组
查询一个字段的值适应的方法是value ,返回一条数据,查不到就是null
查询一列的数据适应的是column方法,返回的是一个一维数组,这个方法的第一个参数是我们查询的列,这个方法还可以添加第二个参数,第二个值会以
key的形式返回给我们
查询我想着最多的还是使用的select的方法,返回的值是一个数组
7. 还学了一点条件构造器的知识: $sql= $db->where(
[
'id' => ['EGT',1]//条件是id>=1
]
)->buildSql();
这个以后要是用到了再来看看视频 https://www.imooc.com/video/15179/0
现在需要记住一点就是where是可以重复使用的
模型
为什么使用模型?例如:在操作的时候一个用户的信息可能要操作的数据表有多个(user userinfo表) 在控制层中每次操作都执行两个数据库表的操作
很不方便,我们可以创建模型,在模型中定义一个方法来操作数据库表,可以达到复用的效果
什么是模型??
简单的来说 模型就是项目中MVC结构的M层 model层
创建模型 在model模块中创建
:model 的命名: 直接对应我们的数据库表名,
然后继承下thinPHP的model,
我们是可以直接调用数据库的数据,是不是方便了好多
user表 ====> User.php
使用
创建一个User.php的文件 命名空间写好,不然引用不到
use think\Model; 继承下Model
在使用的地方 use app\index\model\User
然后使用 User::get(传入id) 验证是否可以使用模型
1.我们可以使用 User::get()
2.$user = new User;
3.$user = Loader::model("User") 不需要引用
4.$user = model("user") 不需要引用
建议前2种方法
使用模型查询数据
1.$res = User::get(1) //参数是id
$res -> username
//参数可以这样传 闭包函数
User::get(function($query){
$query->where("id","eq",1)
->field("id,username")
});
2.User::where("id",1) //条件
->field("id,username") //指定查询的属性
->find()
3.获取多条记录
User::all("1,2,3,34,54,122") 传递的参数是查询的主键id
返回的结果是一个user对象的集合
User::all([1,23,43,43,2,34]) 传递的参数是查询的主键id
User::all(function($query){
$query->where("id" ,">",5)
->field('''''')
})
4.User::where("id",">",10)
->链式操作
->select()
返回的结果是一个user对象的集合
使用模型添加数据
1. User::creat([
"username" => "name"
"password" => "password"
],true); 排除不想添加的字段
User::creat([
"username" => "name"
"password" => "password"
],["username"]); 指定添加的字段
2. $user = new User;
$user->username="name";
$user->password="dfdsaf"
$user->save()
$user->id()获取添加的数据的id
3. $user->save([
"username" => "name"
])
//allowField(true) 这个可以排除不想添加的字段 参数也可以是一个数组
$user->allowField(true) ->save([
"username" => "name"
"不存在的字段" => "324"
])
4.saveAll([
[],
[]
])
$user = new User;
$user-> saveAll([
[
"username" => "name"
"password" => "2312"
],
[
"username" => "name2"
"password" => "2312" "password" => "2312"
]
])
使用模型更新数据
1.update
2.借助 get() save()
3.save 方法 指定条件
使用模型删除数据
1.destroy() 参数可以传入主键的值 也可以是闭包函数
2.delete {
可以先获取对象后删除
也可以添加where条件
}
模型聚合操作
User::count()
User::where("id",">",2)
->count();
1.count 条数
2.max("num") 一个列中的最大值
3.sum("num") 求和
4.avg("num") 平均值
5.min 最小值
6.
模型获取器
在模型中定义方法 getSexAttr($val){ 对应属性字段 获取器的设置
switch ($val){
case "1":
return "男";
break;
case "2":
return "女";
break;
default:
return "未知";
break;
}
}
打开App,阅读手记