ThinkPHP6模型中的获取器,修改器及搜索器的简单使用

简介: 本文介绍了ThinkPHP6模型中的获取器、修改器和搜索器的使用方法。获取器用于对模型数据进行自动处理,修改器用于处理模型设置的数据,搜索器用于封装字段的查询条件表达式。文章通过示例代码展示了如何在模型中定义和使用这些方法,以及如何通过控制器调用模型方法进行数据操作。

1. 获取器

获取器的作用是对模型实例的(原始)数据做出自动处理。一个获取器对应模型的一个特殊方法(该方法必须为public类型),方法命名规范为:

getFieldNameAttr (get字段名Attr)

FieldName为数据表字段的驼峰转换,定义了获取器之后会在下列情况自动触发:

  • 模型的数据对象取值操作($model->field_name);
  • 模型的序列化输出操作($model->toArray()toJson());
  • 显式调用getAttr方法($this->getAttr('field_name'));

获取器的场景包括:

  • 时间日期字段的格式化输出;
  • 集合或枚举类型的输出;
  • 数字状态字段的输出;
  • 组合字段的输出;

最常用的就是你的数据库中比如存放了某种状态信息,对应-1,1,2,实际的意思可能为不同的状态,删除,禁用,正常,待审核…

利用获取器我们可以在数据查询过程中将数字状态转换为对应的文字,比如:

<?php
namespace app\model;

use think\Model;

class User extends Model 
{
   
    protected $table = "user";
    // 查询单个用户的方法
    public function queryUserById($id=6)
    {
   
        $user = User::find($id);
        return $user->toArray();
    }

    // 获取器
    public function getStatusAttr($value)
    {
   
        $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
        return $status[$value];
    }
}
<?php
namespace app\controller;

use app\BaseController;
use app\model\User;

class test extends BaseController{
   

    public function index(){
   
        $model = new User();
        $data = $model->queryUserById();
        dump($data) ;
    }
}

在这里插入图片描述

tips:当你定义获取器后,你想得到原始的数据信息,可以通过getData()方法来获取原始的数据。

2. 修改器

和获取器相反,修改器的主要作用是对模型设置的数据对象值进行处理。

修改器方法的命名规范为:

setFieldNameAttr (set字段名Attr)

修改器的使用场景和读取器类似:

  • 时间日期字段的转换写入;
  • 集合或枚举类型的写入;
  • 数字状态字段的写入;
  • 某个字段涉及其它字段的条件或者组合写入;

定义了修改器之后会在下列情况下触发:

  • 模型对象赋值;
  • 调用模型的data方法,并且第二个参数传入true
  • 调用模型的appendData方法,并且第二个参数传入true
  • 调用模型的save方法,并且传入数据;
  • 显式调用模型的setAttr方法;
  • 显式调用模型的setAttrs方法,效果与appendData并传入true的用法相同;

tips: 修改器方法仅对模型的写入方法有效,调用数据库的写入方法写入无效

最常见的就是往数据库插入数据时,比如说一些涉及金额的字段值,将你传入的值转换为浮点型…

<?php
namespace app\model;
use think\model;

class Shops extends Model{
   

    protected $table = "shops";

    public function addShops(){
   
        $shop = Shops::create([
            'shop_name'=>'茶叶',
            'shop_price'=>'1999.9',
            'addtime'=>date("y-m-d")
        ]);
        return $shop->toArray();
    }

    // 金额字段修改器
    public function setShopPriceAttr($value){
   
        return floatval($value);
    }

}
<?php
namespace app\controller;

use app\BaseController;
use app\model\Shops;

class test extends BaseController{
   

    public function index(){
   
        $model = new Shops();
        $data = $model->addShops();
        dump($data) ;
    }
}

在这里插入图片描述

3. 搜索器

搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式,一个搜索器对应一个特殊的方法(该方法必须是public类型),方法命名规范为:

searchFieldNameAttr (search字段名Attr)

FieldName为数据表字段的驼峰转换,搜索器仅在调用withSearch方法的时候触发。

搜索器的场景包括:

  • 限制和规范表单的搜索条件;
  • 预定义查询条件简化查询;

比如:查询一个name包含J,age>16的用户信息,如下。

<?php
namespace app\model;
use think\model;

class User extends Model{
   

    protected $table = "user";

    public function queryUserLike(){
   
        $user = User::withSearch(['name','age'],[
            'name'=>'J',
            'age'=>'16',
        ])->select();
        return $user->toArray();
    }

    // 自定义搜索器 search`FieldName`Attr,每个字段名对应一个搜索器
    public function searchNameAttr($query, $value, $data){
   
        $query->where('name','like', '%'.$value . '%');
    }

    public function searchAgeAttr($query, $value, $data){
   
        $query->where('age','>', $value );
    }
}
<?php
namespace app\controller;

use app\BaseController;
use app\model\User;

class test extends BaseController{
   

    public function index(){
   
        $model = new User();
        $data = $model->queryUserLike();
        dump($data) ;
    }
}


tp6快结束啦,可以差不多该准备写个小项目了!- ^_^ -!

相关文章
|
中间件 关系型数据库 Shell
Django容易被遗忘却无比重要的框架默认文件介绍及使用方法
Django容易被遗忘却无比重要的框架默认文件介绍及使用方法
70 0
|
4月前
|
安全 PHP 数据库
laravel中模型中$fillable的用法
通过正确使用 `$fillable`属性,开发者可以有效地保护应用免受批量赋值漏洞的影响。它使得只有指定的字段可以被外部用户输入影响,为应用数据的安全性提供了一道防线。在开发使用Laravel框架的应用时,恰当地设置 `$fillable`或 `$guarded`属性是一项最佳实践。
125 1
Yii2的文档怎么写?具体步骤是怎样的?底层原理是什么?
Yii2的文档怎么写?具体步骤是怎样的?底层原理是什么?
128 0
|
缓存 前端开发 JavaScript
如何优化Yii2视图文件的加载速度?具体步骤是怎样的?底层原理是什么?
如何优化Yii2视图文件的加载速度?具体步骤是怎样的?底层原理是什么?
154 0
|
自然语言处理 搜索推荐 PHP
Yii2.0中如何创建xunsearch索引?具体步骤是怎样的?底层原理是什么?
Yii2.0中如何创建xunsearch索引?具体步骤是怎样的?底层原理是什么?
126 0
|
测试技术
FastAPI 学习之路(二十五)路径操作装饰器依赖项
FastAPI 学习之路(二十五)路径操作装饰器依赖项
FastAPI 学习之路(二十五)路径操作装饰器依赖项
|
数据库 Python
Django入门-5:模型的基本使用3-模型成员&创建对象
Django入门-5:模型的基本使用3-模型成员&创建对象
106 0
thinkphp5常用模板标签使用方法
thinkphp5常用模板标签使用方法
276 0