数据库
配置数据库
在使用数据库之前必须要写配置数据库database.php
原生操作
query
(查询操作)和execute
(写入操作)
Db::query('select * from think_user where id=?',[8]);
Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);
利用构造器
Db::table('think_user')
->where('name','like','%thinkphp')
->where('status',1)
->find();
Db::table('think_user')
->where('name','like','%thinkphp')
->whereOr('title','like','%thinkphp')
->find();
Db::table('think_user')->field('id,title,content')->select();
这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值。执行的SQL相当于:
SELECT id,title,content FROM table
推荐操作
使用model
模型Model
定义
namespace app\index\model;
use think\Model;
class User extends Model
{
// 设置当前模型对应的完整数据表名称
protected $table = 'think_user';//非必须
//默认主键自动识别,如需要指定课设置属性
protected $pk = 'uid';//非必须
}
模型会自动对应数据表,采用驼峰法命名,并且首字母大写,例如:
模型名 | 约定对应数据表(假设数据库的前缀定义是 think_) |
---|---|
User | think_user |
UserType | think_user_type |
数据库前缀在database.php设置
调用模型
// 实例化模型
$user = new User;//记得引入命名空间
$user->name= 'thinkphp';
$user->save();
利用模型进行数据库的增删改查
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
$user = new User($_POST);
// post数组中只有name和email字段会写入
$user->allowField(['name','email'])->save();
save方法返回写入的记录数
添加多条:
$user = new User;
$list = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);
更新:
$user = User::get(1);
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
$user = new User;
$list = [
['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com']
];
$user->saveAll($list);
删除:
User::destroy(1);
// 支持批量删除多个数据
User::destroy('1,2,3');
// 删除状态为0的数据
User::destroy(['status' => 0]);
User::where('id','>',10)->delete();
查询:
$user = new User();
// 查询单个数据
$user->where('name', 'thinkphp')
->find();
get
或者find
方法返回的是当前模型的对象实例,可以使用模型的方法。
获取器
eg:从数据库里获取性别为1,转化为男
class User extends Model
{
public function getStatusAttr($value)
{
$status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
return $status[$value];
}
}
status是表里的一个字段
$user = User::get(1);
echo $user->status; // 不会输出数字而是数字对应的文字
修改器
数据赋值时进行转换处理
class User extends Model
{
public function setNameAttr($value)
{
return strtolower($value);
}
}
保存到数据库中的时候会转为小写
$user = new User();
$user->name = 'THINKPHP';
$user->save();
echo $user->name; // thinkphp
修改器只在执行模型的save方法的时候触发
时间戳
数据库配置文件中添加全局设置:
// 开启自动写入时间戳字段
'auto_timestamp' => true,
or
// 开启自动写入时间戳字段
'auto_timestamp' => 'datetime',
字段名默认创建时间字段为create_time
,更新时间字段为update_time
,支持的字段类型包括timestamp/datetime/int
写入数据的时候,系统会自动写入create_time
和update_time
字段
eg:
$user = new User();
$user->name = 'THINKPHP';
$user->save();
echo $user->create_time; // 输出类似 2019-06-16 14:20:10
echo $user->update_time; // 输出类似 2019-06-16 14:24:27
只读字段
class User extends Model
{
protected $readonly = ['name','email'];
}
name
和email
字段为只读字段,不允许被更改,写了就改不了了
类型转换
写入和读取的时候自动进行类型转换处理
class User extends Model
{
protected $type = [
'status' => 'integer',
'score' => 'float',
'birthday' => 'datetime',
'info' => 'array',
];
}
如果设置为强制转换为
array
类型,系统会自动把数组编码为json格式字符串写入数据库,取出来的时候会自动解码。指定为
json
类型的话,数据会自动json_encode
写入,并且在读取的时候自动json_decode
处理。
模型分层
- 数据层:app\index\model\User 用于定义数据相关的自动验证和自动完成和数据存取接口
- 逻辑层:app\index\logic\User 用于定义用户相关的业务逻辑
- 服务层:app\index\service\User 用于定义用户相关的服务接口等
app\index\model\User.php
namespace app\index\model;
use think\Model;
class User extends Model
{
}
实例化方法:\think\Loader::model('User')
Logic类:app\index\logic\User.php
namespace app\index\logic;
use think\Model;
class User extends Model
{
}
实例化方法:\think\Loader::model('User','logic');
Service类:app\index\service\User.php
namespace app\index\service;
use think\Model;
class User extends Model
{
}
实例化方法:\think\Loader::model('User','service');
模型toArray
$user = User::find(1);
dump($user->toArray());
模型toJson
$user = User::get(1);
echo $user->toJson();
事件
在进行模型写入操作时触发的操作行为,包括模型的save方法和delete方法
事件支持
before_delete
、after_delete
、before_write
、after_write
、before_update
、after_update
、before_insert
、after_insert
namespace app\index\model;
use think\Model;
class User extends Model
{
protected static function init()
{
User::event('before_insert', function ($user) {
if ($user->status != 1) {
return false;
}
});
}
}
多表关联
<?php
namespace app\index\model;
use think\Model;
class Profile extends Model
{
public function user()
{
return $this->belongsTo('User','uid');//uid为关联外键
}
}
关联后就可以:
$profile = Profile::get(1);
// 输出User关联模型的属性
echo $profile->user->account;
视图View
实例化:
继承了\think\controller:
便可以直接调用:
方法 | 说明 |
---|---|
fetch | 渲染模板输出 |
display | 渲染内容输出 |
assign | 模板变量赋值 |
eg:
return $this->display('index');
没有继承think\controller
return \view('index')
模板
变量输出
在模板中输出变量
$view = new View();
$view->name = 'ThinkPHP';
return $view->fetch();
前端页面(eg:html)
Hello,{$name}!
运行的时候就会在前端显示: Hello,ThinkPHP!
模块继承
一个模板中可以定义任意多个名称标识不重复的区块,例如下面定义了一个base.html
基础模板:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{block name="title"}标题{/block}</title>
</head>
<body>
{block name="menu"}菜单{/block}
{block name="left"}左边分栏{/block}
{block name="main"}主内容{/block}
{block name="footer"}底部{/block}
</body>
</html>
在子模板(其实是当前操作的入口模板)中使用继承
{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
<a href="/" >首页</a>
<a href="/info/" >资讯</a>
<a href="/bbs/" >论坛</a>
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
<a href="/new/{$vo.id}">{$vo.title}</a><br/>
{$vo.content}
{/volist}
{/block}
{block name="right"}
最新资讯:
{volist name="news" id="new"}
<a href="/new/{$new.id}">{$new.title}</a><br/>
{/volist}
{/block}
{block name="footer"}
{__block__}
@ThinkPHP 版权所有
{/block}
常见内置标签
标签名 | 作用 | 包含属性 |
---|---|---|
include | 包含外部模板文件(闭合) | file |
load | 导入资源文件(闭合 包括js css import别名) | file,href,type,value,basepath |
volist | 循环数组数据输出 | name,id,offset,length,key,mod |
foreach | 数组或对象遍历输出 | name,item,key |
※ volist通常用于查询数据集(select方法)
控制器中给模板赋值:
$list = User::all();
$this->assign('list',$list);
模板:
{volist name='list' id='data'}
ID为{$data.id}:名字为{$data.name}<br>
{/volist}