thinkphp-模型字段的设置
字段设置
模型的数据字段和表字段是对应关系,默认会自动获取,包括字段的类型;
自动获取会导致增加一次查询,如果在模型中配置字段信息,会减少内存开销;
可以在模型设置$schema 字段,明确定义字段信息,字段需要对应表写完整
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; // 开启或关闭后均为无效字段无内容
结论:并非肆无忌惮的不严格,只能首字母大写