《TP5.0学习笔记---模型篇(三)》

一、模型修改器+自动完成
将这两个放在一起学习,是因为这两个有很多的相似之处,下边看一下修改器

控制器Index.php
public function index()
    {
       //首先我们向数据库中添加一条数据
        $res = User::create([
            'username'  => 'liangyu',
            'password'  => 'liangyu',//注意,我这里没有对其加密,后边我会让它自动完成修改,也就是要说的修改器
            'email'     => 'liangyu@qq.com',
            'num'       => 520
        ]);
        dump($res->id);
    //密码没有加密,那么我们如何通过修改器让它进行自动的修改,这个时候就需要在模型中编写代码
    }
模型User.php
public function setPasswordAttr($val){
        return md5($val);//定义了这个方法之后,它会自动传递password给$val
    //这个时候,当我们再进行数据插入的时候,它就会对密码自动的进行加密
    }
    //当然我们还可以传递第二个参数$data,它接收的是,我们插入的这条数据的所有元素(之前说的那个自动将0在输出的时候打印为“未知”,那个getSexAttr的方法,也可以传递第二个参数$data,表示的含义是一样的)
    public function setPasswordAttr($val, $data){
        return $val . $data['email'];//这个就表示,将密码+email整体当做最终密码,当然还可以对整体进行加密,这样更安全
        //return md5($val . $data['email']);
    }

这里写图片描述
然后我们说一下自动完成:

控制器Index.php
 public function index()
    {
       //首先我们向数据库中添加一条数据
        $res = User::create([
            'username'  => 'liangyu',
            'password'  => 'liangyu',
            'email'     => 'liangyu@qq.com',
            'num'       => 520
        ]);
        dump($res->id);
    }
模型User.php
//如果想使用自动完成,那么就需要在模型中声明
    protected $auto = [//数组中的内容,就是我们要自动的字段
        'time'
    ];//这个$auto是在我们进行数据添加和更新的时候都会发生变化,都会发生的操作。它的方法和我们的修改器是一样的
    public function setTimeAttr(){//首先,我们修改一下自己的数据库,在我们的数据库中添加一个time字段
        return time();
    }//这个时候,刷新数据库,新添加的这条数据就有了time()

这里写图片描述

控制器:Index.php
public function index()
    {
       //首先我们向数据库中添加一条数据
        $res = User::create([
            'username'  => 'liangyu',
            'password'  => 'liangyu',
            'email'     => 'liangyu@qq.com',
            'num'       => 520
        ]);
        // $userModel = new User;
        // $userModel->get(101);
        // $userModel->sex = 1;
        // $res = $userModel->save(); 
        dump($res->id);
    }
模型User.php
namespace app\index\model;
use think\Model;

class User extends Model{
//如果想使用自动完成,那么就需要在模型中声明
    protected $auto = [//数组中的内容,就是我们要自动的字段
        'time'
    ];//这个$auto是在我们进行数据添加和更新的时候都会发生变化,都会发生的操作。它的方法和我们的修改器是一样的

//另外,我们还可以声明一个$insert数组,这个数组,它只在数据插入的时候有效
    protected $insert = [
        'time_insert'
    ];
    //同样我们还可以添加$update数组,它是在数据更新的时候发生改变
    $protected $update = [//我们在数据库中首先使用之前学过的修改记录的值,进行修改,那么该修改器会被自动调用
        'time_update'
    ];
    public function setTimeAttr(){//首先,我们修改一下自己的数据库,在我们的数据库中添加一个time字段
        return time();
    }//这个时候,刷新数据库,新添加的这条数据就有了time()
    public function setTimeInsertAttr(){//这个时候,我们先去给我们的数据表添加一个time_insert字段
        return time();//插入时间
    }//这样我们再刷新一下我们的页面,机会看见数据表中新添的记录中有了time_insert值
    public function setTimeUpdateAttr(){
        return time();
    }
    //这种修改器函数的命名是set+字段名(驼峰命名法)+Attr()
}

二、模型时间戳+软删除
时间戳是做什么使用的呢?
比如说我们对数据进行新增或更新的操作时,我们往往需要在数据库中记录我们的插入时间和更改时间。通过前边的知识我们知道,我们可以使用自动完成的方式来实现这个功能,但是,我们大多数的数据库会有这样的字段,如果我们每一个都要这样去编写这样自动更新或自动完成的操作,那么我们的代码就会变得很臃肿,我们实现起来也不是很方便。所以thinkphp的model类,为我们提供了自动的时间戳功能,它会将我们数据的更新时间和创建时间记录到数据库中。
软删除
在我们对数据进行删除的操作,我们往往不会将这条数据真正的从数据库中删除,而是将它的某一个字段设置为一个特定的值,代表这个字段已经被删除,或者代表这条记录已经被删除。下边用代码演示一下:

首先我会将之前的那个表删除掉,重新创建一个表,因为之前的表字段太多,模拟起来不方便(表名不变)
表结构
这里写图片描述

控制器:Index.php
namespace app\index\controller;

use think\Controller;
use app\index\model\User;//使用我们刚刚新建的那个模型
//use think\Loader;//通过引入think下的Loader类
class Index extends Controller
{
    public function index()
    {
//第一种方式
//如果我们想全局的开启添加时间和更新时间,时间戳的自动完成这个操作,那么我们可以修改配置文件(database.php中找到auto_timestamp,将它的值设置为true)
    //然后我们现在开始插入数据
        $res = User::create([
            'name'     =>  'shulv',
            'password' =>  md5('liangyu')
        ]);
        dump($res);//当我们刷新页面的时候就会发现,create_time和update_time字段已经有值了
    //但是,并不是所有的表都有新增时间和更新时间的字段,所以一般情况下不建议直接在配置文件中进行修改。因为它如果修改的话,如果你的一个表中不存在时间戳的字段,那么程序可能就会报错,所以我们还是将它设置为false

    //这个时候我们进入对应的模型(User.php)中添加一个属性$autoWriteTimestamp

//我们再进行一下修改的操作
        $user = User::get(0);
        $user->name = 'liangyu';
        $res = $user->save();
        dump($res);//此时我们会发现数据库中id=0的这条记录的两个时间戳字段的值也发生了更新

/*
现在有一个问题就是,如果我们数据库中的两个时间戳字段名不是create_time和update_time,比如说我给它们改成create_at和update_at,那么此时我们再刷新的时候,他就会报错,说update_time和update_time不存在。因为我们在使用配置的时候,它的默认配置就是update_time,所以我们需要在model中继续申请一个属性
*/
    }
}
模型:User.php
namespace app\index\model;
use think\Model;

class User extends Model{
    protected $autoWriteTimestamp = true;//利用这个属性来开启时间戳功能。这个时候我们再更新页面,那两个时间戳字段也会被添加进去
    protected $createTime = 'create_at';//这里直接写上我们的字段名
    protected $updateTime = 'update_at';//这个时候我们再刷新浏览器就不会报错了,时间也会被更新
//当然我们还可以将$createTime或$updateTime设置为false,便是关闭该项,那么它会使用默认值(0),就不会去更新这个字段了
}

软删除

控制器:Index.php
namespace app\index\controller;

use think\Controller;
use app\index\model\User;//使用我们刚刚新建的那个模型
//use think\Loader;//通过引入think下的Loader类
class Index extends Controller
{
    public function index()
    {
//在说软删除的时候,我们先向数据库中添加一个delete_time字段(允许为null,null代表这条数据没有被删除)
//如果我们想使用软删除,我们需要在模型中引入traits\modelSoftDelete(去看模型User.php)
        //在模型中引入traits\modelSoftDelete之后,就可以直接在控制器中进行删除了
        $res = User::destroy(0);
        dump($res);
//这个时候我们在数据表中可以看见id=0的字段并没有被真正的删除,它的delete_time字段名变成了时间戳,说明这条数据在指定的时间点被删除(软删除)。这个时候当你尝试获取刚刚被软删除的记录时,返回的是null,也就是说不能再获取了。如果你确实需要获取到我们包含软删除的这些记录,那么我们就可以使用下边这样的方式
        $res = User::withTrashed(true)->find(0);//这个时候就能得到了
        dump($res);
        dump($res->getData());//可以获取原始数据

//还有一种方式就是,比如说我们软删除的记录都放在了垃圾箱里,那么我们要获取这些被软删除的数据,就可以这样
        $res = User::onlyTrashed()->select();//返回的是数组,我们可以通过foreach遍历
        dump($res);
//那么,如果我们想对数据进行恢复,可以直接使用update方法,将delete_time的值设置为null即可
//当我们不想软删除这个字段名为delete_time时,我们还是使用更改create_time那种在model中声明变量的方式进行更改

//那么如果我们真正的想删除某一个记录时应该怎么做呢?
        $res = User::destroy(0, true);//传递第二个参数为true即可
        dump($res);
//还可以通过先获取,再删除的方式
        $user = User::get(0);
        $res = $user->delete(0, true);
        dump($res);
    }
}
模型:User.php

namespace app\index\model;
use think\Model;
use traits\modelSoftDelete;
class User extends Model{

    use SoftDelete;
    protected $autoWriteTimestamp = true;//利用这个属性来开启时间戳功能。这个时候我们再更新页面,那两个时间戳字段也会被添加进去
    protected $createTime = 'create_at';//这里直接写上我们的字段名
    protected $updateTime = 'update_at';//这个时候我们再刷新浏览器就不会报错了,时间也会被更新
//当然我们还可以将$createTime或$updateTime设置为false,便是关闭该项,那么它会使用默认值(0),就不会去更新这个字段了
    protected $updateTime = 'delete_at';
}

TP5.0的东西就说这么多啦,希望对入门的小伙伴们有所帮助,共同进步!^_^

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值