thinkphp-模型字段的设置

5577次阅读 139人点赞 作者: WuBin 发布时间: 2024-04-17 09:47:28
扫码到手机查看

字段设置

模型的数据字段和表字段是对应关系,默认会自动获取,包括字段的类型;

自动获取会导致增加一次查询,如果在模型中配置字段信息,会减少内存开销;

可以在模型设置$schema 字段,明确定义字段信息,字段需要对应表写完整

比如,我在controller/DataModel.php中,新建一个访问路径
public function field() {
        UserModel::select();
}

然后在浏览器中访问这个field路径,在开启了调试模式后,我们可以在调试面板的选项卡-SQL中看到如下信息:

CONNECT:[ UseTime:0.007639s ] mysql:host=127.0.0.1;port=3306;dbname=grade;charset=utf8
SHOW FULL COLUMNS FROM `tp_user` [ RunTime:0.010692s ]
SELECT * FROM `tp_user` [ RunTime:0.000913s ]

执行了一次select(),实际上执行了2次查询。然后我们修改一下模型:

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

class User extends Model
{
    // 要写全,将数据表中字段以及其对应的数据类型都列出来
     protected $schema = [
        'id' => 'int',
        'username' => 'string',
        'status' => 'int',
        'create_time' => 'datetime',
        ...
     ];
}

这时候在执行访问路径,就可以发现减少了一次SQL查询

CONNECT:[ UseTime:0.019772s ] mysql:host=127.0.0.1;port=3306;dbname=grade;charset=utf8
SELECT * FROM `tp_user` [ RunTime:0.000483s ]
注:这种方法只对模型有效,对Db方法查询无效
 Db::name('user')->select();
// 调试面板SQL依然输出
CONNECT:[ UseTime:0.017961s ] mysql:host=127.0.0.1;port=3306;dbname=grade;charset=utf8
SHOW FULL COLUMNS FROM `tp_user` [ RunTime:0.000783s ]
SELECT * FROM `tp_user` [ RunTime:0.000335s ]

开启字段缓存

因为就算在模型中设置了schema,也只对模型有效,如果要同时对模型和Db方法都有效,就要使用字段缓存的功能。

首先使用cmd进入到项目根目录下:

D:\phpstudy\phpstudy_pro\WWW\xuexi\tp6

然后执行:

php think optimize:schema

生成后的字段缓存文件在runtime 下schema 文件加下(注意这里有误,最新的tp6-6.1.4版本中不会在runtime下生成schema文件夹存储,会直接存储到cache文件夹下

在ThinkPHP6中,schema字段缓存位置默认是在runtime目录下的cache目录中。具体的缓存文件名通常是以模型类名和数据库连接名为基础,并附加有缓存的哈希值。例如,如果有一个名为User的模型和默认的数据库连接,则缓存文件可能会命名为类似于user_ebe97bf837e32d857df8f9062a39d7ff.php。缓存文件内容是一个PHP数组,包含了从数据库获取的字段信息。

然后在config/database.php中,将fields_cache设置为true

// 数据库连接配置信息
    'connections'     => [
        'mysql' => [
            // 开启字段缓存
            'fields_cache'    => true,
],

然后,无论使用Db或者模型查询,都会减少一次查询。达到模型使用schema的效果。

更多生成字段缓存的语法:

https://blog.csdn.net/weixin_39589693/article/details/113422289

简单总结下:

可以通过生成数据表字段信息缓存,提升数据库查询的性能,避免多余的查询

php think optimize:schema

如果是多应用模式,你需要明确指定应用名称,下面表示生成admin应用的字段缓存

php think optimize:schema admin

默认会自动生成当前数据库配置文件中定义的数据表字段缓存,也可以指定数据库生成字段缓存

指定生成demo数据库下面的所有数据表的字段缓存信息

php think optimize:schema --db demo

如果你的应用使用了不同的数据库连接,可以根据应用来生成

php think optimize:schema --app index

如果需要单独更新某个数据表的缓存

php think optimize:schema --table think_user

支持指定数据库名称

php think optimize:schema --table demo.think_user

调用数据

当数据获取到后,想要单独获取数据可以用->和数组方式来获取

$user = UserModel::find(19);
echo $user->username;
echo $user['email']; // 使用数组方式也可以访问

如果我们在模型端把数据整理好,交给控制器直接调用,在UserModel模型中,新建一个方法

public function getUsername()
    {
        // $this即代表以上在控制器中的UserModel
        $obj = $this->find(19);
        // return $obj->username; // 实测这种方式也可以
        return $obj->getAttr('username');
    }

在控制器中

$user = new UserModel();
echo $user->getUsername();

字段的赋值操作,也可以是->和数组方式,作用就是提交给模型处理

$user = new UserModel();
$user->username = 'Mr.Lee';
$user['email'] = 'lee@163.com';

默认情况下,字段是严格区分大小写的,也就是需要和数据表字段保持一致,如果要改为不严格区分,需要在模型中设置,我们可以在模型属性$strict 设置为false 即可实现非严格字段

在模型中:

namespace app\model;
use think\Model;

class User extends Model
{
    // 控制是否严格区分大小写
     protected $strict = false;
}

在控制器中

$user = UserModel::find(19);
// strict = false代表开启 strict=true 代表关闭
echo $user->create_time; // 原本字段是create_time,开启关闭都正常有内容
echo '<br>';
echo $user->createTime; // 开启后正常,关闭后为无效字段无内容
echo '<br>';
echo $user->CreateTime; // 开启后正常,关闭后为无效字段无内容
echo '<br>';
echo $user->CreatETime; // 开启或关闭后均为无效字段无内容
结论:并非肆无忌惮的不严格,只能首字母大写

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:thinkphp
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9603次阅读 623人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    4297次阅读 317人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14452次阅读 948人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    13497次阅读 491人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    12015次阅读 963人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    16376次阅读 1307人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    15187次阅读 1234人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    29849次阅读 2347人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    25911次阅读 1994人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录