Thinkphp5.0 笔记

环境变量配置: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类


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    = '[email protected]';
$user->save();

也可以使用data方法批量赋值:
$user = new User;
$user->data([
    'name'  =>  'thinkphp',
    'email' =>  '[email protected]'
]);
$user->save();

或者直接在实例化的时候传入数据
$user = new User([
    'name'  =>  'thinkphp',
    'email' =>  '[email protected]'
]);
$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' =>  '[email protected]'
]);

7.添加多条数据

$user = new User;
$list = [
    ['name'=>'thinkphp','email'=>'[email protected]'],
    ['name'=>'onethink','email'=>'[email protected]']
];
$user->saveAll($list);

如果带着主键会默认为修改操作,但如果要带着主键新增,则可如下操作。
$user = new User;
$list = [
    ['id'=>1, 'name'=>'thinkphp', 'email'=>'[email protected]'],
    ['id'=>2, 'name'=>'onethink', 'email'=>'[email protected]'],
];
$user->saveAll($list, false);

8.更新单条数据

User::where('id', 1)
    ->update(['name' => 'thinkphp']);

在取出数据后,更改字段内容后更新数据。
$user = User::get(1);
$user->name     = 'thinkphp';
$user->email    = '[email protected]';
$user->save();

也可以直接带更新条件来更新数据
$user = new User;
// save方法第二个参数为更新条件
$user->save([
    'name'  => 'thinkphp',
    'email' => '[email protected]'
],['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'=>'[email protected]'],
    ['id'=>2, 'name'=>'onethink', 'email'=>'[email protected]']
];
$user->saveAll($list);

有时系统会认为是新增操作,则可以进行强制更新操作。
$user = new User;
$list = [
    ['id'=>1, 'name'=>'thinkphp', 'email'=>'[email protected]'],
    ['id'=>2, 'name'=>'onethink', 'email'=>'[email protected]']
];
$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();

你可能感兴趣的:(Thinkphp5.0 笔记)