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

news2025/1/12 13:36:49

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

  • 1. 获取器
  • 2. 修改器
  • 3. 搜索器

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快结束啦,可以差不多该准备写个小项目了!- ^_^ -!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL(用户管理)

文章目录 1 用户1.1 用户信息1.2 创建用户1.3 删除用户1.4 修改用户密码 2 数据库的权限2.1 给用户授权2.2 回收权限 1 用户 1.1 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 host&#xff1a; 表示这个用户可以从哪个主机登陆&#xff0c;如果是l…

GPT专业应用:如何让GPT策划方案

身为一名职场打工人&#xff0c;或多或少会面临需要写策划案的难题。 不管是策划一场线下活动&#xff0c;还是策划业务发展的方向&#xff1b; 甚至到生活中还需要策划婚礼&#xff0c;策划房屋装修&#xff0c;策划和朋友的聚会等等。那么如何快速积累经验&#xff0c;找准…

项目管理基础:什么是项目管理?

一、项目管理的缘起与发展 项目管理并非基础学科&#xff0c;它是人类在生产实践中不断的经验积累所总结归纳的一门学科&#xff0c;在人们不断的完善与修订下逐步形成了现有的项目管理知识体系。 项目经理是随着人们对项目管理要求的提升而逐渐分化出的一个专业职位&#xf…

SNAT与DNAT的应用

目录 一、SNAT概述 1.SNAT应用环境——局域网共享上网 2. SNAT工作原理 2.1未作SNAT转换时 2.2进行SNAT转换后 二、配置SNAT策略 1.开启IP路由转发 2.SNAT转换 3.模拟实验 3.1服务端 3.2网关服务器 3.3网关服务器设置iptables规则 3.4客户端 3.5实验结果 三、DNAT概…

Tauri应用开发(二):创建第一个Tauri应用

创建tauri应用 推荐参考官方文档&#xff1a;https://tauri.app/v1/guides/ 创建命令&#xff1a; npm create tauri-applatest&#x1f4a1;注意&#xff1a;请确保Node.js和Rust已经正确安装 在创建过程中&#xff0c;需要根据提示选择配置项。 主要配置有&#xff1a; 项目…

在Postman接口工具,脚本中发送请求(pm.sendRequest)

Postman的Collection(集合)/Folder(集合的子文件夹)/Request(请求)都有Pre-request script和Tests两个脚本区域, 分别可以在发送请求前和请求后使用脚本(基于Javascript实现各种操作) 在遇到有依赖的接口时,比如需要登录或者需要从前一个接口的结果中获取参数时,我们往往需要在…

vue+element实现美观大方好看的音乐网站,仿照咪咕音乐网

目录 一、前言 二、实现及效果图 1.效果图 2.项目结构、设计说明 3.顶部菜单 4.首页轮播图 5.歌单推荐 三、总结 一、前言 咪咕音乐网&#xff0c;最近看到其官网&#xff0c;第一感觉真的很美观大方&#xff0c;有被它惊艳到。所以作者忍不住做了一版仿照咪咕音乐的demo。…

庄懂的TA笔记(十七)<特效:屏幕UV + 屏幕扰动>

庄懂的TA笔记&#xff08;十七&#xff09;&#xff1c;特效&#xff1a;屏幕UV 屏幕扰动&#xff1e; 大纲&#xff1a; 目录 庄懂的TA笔记&#xff08;十七&#xff09;&#xff1c;特效&#xff1a;屏幕UV 屏幕扰动&#xff1e; 大纲&#xff1a; 正文&#xff1a; 一…

UNIX环境高级编程——线程控制

12.1 引言 本章讲解控制线程行为方面的详细内容&#xff0c;介绍线程属性和同步原语属性。 12.2 线程限制 12.3 线程属性 线程属性对象用pthread_attr_t结构表示&#xff0c;可以用这个结构修改线程默认属性&#xff0c;并把这些属性与创建的线程联系起来。 #include <p…

腾讯C++二面,全程2小时追问基础!

今天给大家分享星球一位同学腾讯面经&#xff0c;主要摘取了部分一二面经&#xff0c;然后部分问题我做了补充说明~ 星球原文&#xff1a;https://t.zsxq.com/0eO4O13HV&#xff0c;已获授权 一面 1、C11有哪些新特性&#xff0c;有哪些新关键字 2、C中结构体占多少字节&…

51单片机——I2C-EEPROM实验,小白讲解,相互学习

I2C介绍 I2C&#xff08;Inter&#xff0d;Integrated Circuit&#xff09;总线是由 PHILIPS 公司开发的两线式 串行总线&#xff0c;用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的 一种总线标准。它是同步通信的一种特殊形式&#xff0c;具有接口线少&#x…

【逆向工程核心原理:SEH】

SEH SEH是Windows操作系统提供的异常处理机制&#xff0c;在程序源代码中使用__ try、 __except、__finally关键字来具体实现。主要用在反调试中。 注&#xff1a; SEH与C中的try. catch 异常处理具有不同结构。从时间上看&#xff0c;与C的try、catch异常处理相比&#xff0…

uni-app--》uView组件库:提升您的uni-app开发体验

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

MMDet3d样本均衡

MMDet3d样本均衡 文章目录 MMDet3d样本均衡CBGSDataset训练时数据是200帧&#xff0c;后面处理时&#xff0c;dataloader中数据变成了460帧&#xff0c;怎么均衡的&#xff1f;思考抽帧数计算某个类别帧数为0 Reference欢迎关注公众号【三戒纪元】 CBGSDataset **CBGS &#x…

UE虚幻引擎,Unity3D,Blender区别和联系

1. 官网手册 UnityUEBlenderUnity 用户手册 (2019.4 LTS) - Unity 手册虚幻引擎5.2文档 | 虚幻引擎5.2文档 (unrealengine.com)Blender 3.5 Reference Manual — Blender Manual 2. Unity, UnrealEngine, Blender的区别 Blender 是一款免费的开源软件&#xff0c;是一个开源…

Godot引擎 4.0 文档 - 循序渐进教程 - 脚本语言

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Scripting languages — Godot Engine (stable) documentation in English 脚本语言 本课将概述 Godot 中可用的脚本语言。您将了解每个选项的优缺点。在下一部分中&…

CentOS7搭建伪分布式Hadoop(全过程2023)

##具体操作目录## 1.配置静态ip2.关闭防火墙3.修改主机名为 *master* &#xff0c;并重启虚拟机vi /etc/hostname 4.修改主机名与ip映射5.设置SSH免密登录6.安装配置java环境----------------------正式Hadoop配置1.移动安装包到合适位置2.解压安装包并重命名3.配置环境变量4.修…

know it and do it

overview&#xff1a; 在一盘盘有立即反馈的系统中&#xff0c;可以更直观的看到知道一个道理和能自然的用出来之间的鸿沟有多大。 这个就是日积月累的训练的意义了。 一夜回到解放前 继续金铲铲的游玩回味&#xff0c;之前一段时间忙于工作就放下了&#xff0c;后来新的版本…

20230521 AI 一周大事件汇总

&#x1f680; ChatGPT 上线联网和插件功能 OpenAI宣布将在这周推出联网和插件功能&#xff0c;位于Alpha和Beta通道的ChatGPT Plus用户都可使用70多个上线的插件。 更新意味着ChatGPT将利用最新的信息和资讯为使用者提供服务。 上线的ChatGPT插件种类涵盖了行程安排助理、代…

拿捏大厂面试官的高质量自动化测试工程师简历--看完必有所获

一、前言&#xff1a;简历&#xff08;职场敲门砖&#xff09; 作为软件测试的垂直领域深耕者&#xff0c;面试或者被面试都是常有的事&#xff0c;可是不管是啥&#xff0c;总和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等&#xff0c…