环境变量配置:ENV::get();
ENV::set()
1.入口文件绑定
1.在入口文件public/index.php
中添加define('BIND_MODULE','index/index/)
; 注: 绑定完成后只能访问index/index
下的方法。
2.在app文件目录下的config.php
中的auto_bind_module
值改为true;
2.模型
1.定义一个User类
<?php
namespace app\index\model;
use think\Model;//使用模型类
class User extends Model //继承模型类
{
/**
* 命名规则 驼峰命名法
* 数据库名 user
* 模型名为 User.php
* 类名为 User
*/
protected $pk = 'uid' //主键默认识别,若需指定,可设置属性$pk;
}
?>
2.控制器引用
// 静态调用
$user = User::get(1);
$user->name = 'thinkphp';
$user->save();
// 实例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();
// 使用 Loader 类实例化(单例)
$user = Loader::model('User');
// 或者使用助手函数`model`
$user = model('User');
$user->name= 'thinkphp';
$user->save();
3.查询单条数据
取出主键为1的数据
$user = User::get(1);
echo $user->name;
// 使用数组查询
$user = User::get(['name' => 'thinkphp']);
// 使用闭包查询
$user = User::get(function($query){
$query->where('name', 'thinkphp');
});
echo $user->name;
或者在实例化模型后调用查询方法
$user = new User();
$user->where('name', 'thinkphp')
->find();
4.查询多条数据
// 根据主键获取多个数据
$list = User::all('1,2,3');
// 或者使用数组
$list = User::all([1,2,3]);
foreach($list as $key=>$user){
echo $user->name;
}
// 使用数组查询
$list = User::all(['status'=>1]);
// 使用闭包查询
$list = User::all(function($query){
$query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
echo $user->name;
}
或者在实例化模型后调用查询方法
$user = new User();
// 查询数据集
$user->where('name', 'thinkphp')
->limit(10)
->order('id', 'desc')
->select();
5.获取某个字段或者某个列的值
// 获取某个用户的积分
User::where('id',10)->value('score');
// 获取某个列的所有值
User::where('status',1)->column('name');
// 以id为索引
User::where('status',1)->column('name','id');
User::where('status',1)->column('id,name'); // 同tp3的getField
6.添加一条数据
第一种是实例化模型对象后赋值并保存:
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
也可以使用data方法批量赋值:
$user = new User;
$user->data([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
或者直接在实例化的时候传入数据
$user = new User([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
如果需要过滤非数据表字段的数据,可以使用:
$user = new User($_POST);
// 过滤post数组中的非数据表字段数据
$user->allowField(true)->save();
如果你通过外部提交赋值给模型,并且希望指定某些字段写入,可以使用:
$user = new User($_POST);
// post数组中只有name和email字段会写入
$user->allowField(['name','email'])->save();
还可以直接静态调用create方法创建并写入:
$user = User::create([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
7.添加多条数据
$user = new User;
$list = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);
如果带着主键会默认为修改操作,但如果要带着主键新增,则可如下操作。
$user = new User;
$list = [
['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'],
];
$user->saveAll($list, false);
8.更新单条数据
User::where('id', 1)
->update(['name' => 'thinkphp']);
在取出数据后,更改字段内容后更新数据。
$user = User::get(1);
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
也可以直接带更新条件来更新数据
$user = new User;
// save方法第二个参数为更新条件
$user->save([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
],['id' => 1]);
如果需要过滤非数据表字段的数据,可以使用:
$user = new User();
// 过滤post数组中的非数据表字段数据
$user->allowField(true)->save($_POST,['id' => 1]);
如果你通过外部提交赋值给模型,并且希望指定某些字段写入,可以使用:
$user = new User();
// post数组中只有name和email字段会写入
$user->allowField(['name','email'])->save($_POST, ['id' => 1]);
9.更新多条数据
$user = new User;
$list = [
['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com']
];
$user->saveAll($list);
有时系统会认为是新增操作,则可以进行强制更新操作。
$user = new User;
$list = [
['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com']
];
$user->isUpdate()->saveAll($list);
10.删除数据
删除当前模型
$user = User::get(1);
$user->delete();
根据主键删除User::destroy(1);
// 支持批量删除多个数据
User::destroy('1,2,3');
// 或者
User::destroy([1,2,3]);
条件删除
// 删除状态为0的数据
User::destroy(['status' => 0]);
闭包删除
User::destroy(function($query){
$query->where('id','>',10);
});
数据库类的查询条件删除
User::where('id','>',10)->delete();
11.聚合查询
$user = new User;
$user->count();
$user->where('status','>',0)->count();
$user->where('status',1)->avg('score');
$user->max('score');
11.获取器
getStatusAttr($value) $value的值获得是status字段的值。
class User extends Model
{
public function getStatusAttr($value)
{
$status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
return $status[$value];
}
}
$data传入的是所有的数据,$data['status']的值其实和$value 传入的值一样,所以也可以如下。
class User extends Model
{
public function getStatusAttr($value,$data)
{
$status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
return $status[$data['status']];
}
}
数据表的字段会自动转换为驼峰法,一般status字段的值采用数值类型,我们可以通过获取器定义,自动转换为字符串描述。
$user = User::get(1);
echo $user->status; // 例如输出“正常”
但是如果想要获得原始数据怎么办呢?getdata()
$user = User::get(1);
$user = $user->getdata(‘status’);
echo $user->status;//此时就输出原始值 1,
12.修改器
setNameAttr($value) $value 的值为接收到的Name字段的值,
class User extends Model
{
public function setNameAttr($value)
{
return strtolower($value);
}
}
如下代码实际保存到数据库中的时候会转为小写
$user = new User();
$user->name = 'THINKPHP';
$user->save();
echo $user->name; // thinkphp
13.时间戳
第一种方式,是在数据库配置文件中添加全局设置:
'auto_timestamp' => true,
第二种是直接在单独的模型类里面设置:
\protected $autoWriteTimestamp = true;
如果这两个地方设置为true,默认识别为整型int类型,如果你的时间字段不是int类型的话,例如使用datetime类型的话,可以这样设置:
'auto_timestamp' => 'datetime', 或者 protected $autoWriteTimestamp = 'datetime';
字段名默认创建时间字段为create_time,更新时间字段为update_time,支持的字段类型包括timestamp/datetime/int。
写入数据的时候,系统会自动写入create_time和update_time字段,而不需要定义修改器,例如:
$user = new User();
$user->name = 'THINKPHP';
$user->save();
echo $user->create_time; // 输出类似 2016-10-12 14:20:10
echo $user->update_time; // 输出类似 2016-10-12 14:20:10
如果你的数据表字段不是默认值的话,可以按照下面的方式定义:
class User extends Model
{
// 定义时间戳字段名
protected $createTime = 'create_at';
protected $updateTime = 'update_at';
}
如果你只需要使用create_time字段而不需要自动写入update_time,则可以单独设置关闭某个字段,例如:
class User extends Model
{
// 关闭自动写入update_time字段
protected $updateTime = false;
}
14.只读字段
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $readonly = ['name','email'];
}
上面定义了当前模型的name和email字段为只读字段,不允许被更改。即使执行了更改操作,数据库中的name,email的值也不会被改变。
15.软删除
要使用软删除功能,需要引入SoftDelete trait,例如User模型按照下面的定义就可以使用软删除功能:
namespace app\index\model;
use think\Model;
use traits\model\SoftDelete;
class User extends Model
{
use SoftDelete;
protected $deleteTime = 'delete_time';
}
// 软删除
User::destroy(1);
// 真实删除
User::destroy(1,true);
$user = User::get(1);
// 软删除
$user->delete();
// 真实删除
$user->delete(true);
默认情况下查询的数据不包含软删除数据,如果需要包含软删除的数据,可以使用下面的方式查询:
User::withTrashed()->find();
User::withTrashed()->select();
如果仅仅需要查询软删除的数据,可以使用:
User::onlyTrashed()->find();
User::onlyTrashed()->select();