ThinkPHP6.0学习笔记-模型操作 (3)

更新的最佳实践原则是:如果需要使用模型事件,那么就先查询后更新,如果不需要使用事件或者不查询直接更新,直接使用静态的Update方法进行条件更新,如非必要,尽量不要使用批量更新。

查询 模型普通查询

使用find()通过主键查询想要的数据(可以在模型类中设置主键字段)

调用find()方法是,如果数据不存在返回Null,使用findOrEmpty()方法,数据不存返回空模型

使用isEmpty()方法判断是否为空模型

使用where()进行条件筛选查询

使用select()方法,查询多条指定主键的字段,不指定就是全部字段

$user = model\UserModel::select([304,305]); foreach ($user as $key=>$value) { echo $value->username; }

支持查询构造器的各种方法

模型动态查询

getBy[字段名]:可以获取对应字段的value(驼峰命名,字段首字母大写)

$user = model\UserModel::getByUsername(\'李白\'); 模型聚合查询

支持max min sum count avg 等方法

UserModel::max(\'price\'); 模型分批查询

支持使用chunk()进行分批处理数据

User::chunk(100, function ($users) { foreach($users as $user){ // 处理user模型对象 } }); 模型游标查询

支持使用cursor()方法进行游标查询,返回生成器对象

foreach(User::where(\'status\', 1)->cursor() as $user){ echo $user->name; }

user变量是一个模型对象实例。

模型查询的最佳实践原则是:在模型外部使用静态方法进行查询,内部使用动态方法查询,包括使用数据库的查询构造器。

模型获取器

获取器的作用是对模型实例的数据做出自动处理

每一个获取器对应模型的一个特殊方法,方法要求public

获取器命名规范

get[FieldName]Attr(),FieldName为数据表字段的驼峰转换,定义了获取器自动触发

模型的数据对象取值操作 $model->field_name

模型的序列化输出操作$model->toArray()

显式调用getAttr方法 $this->getAttr(\'field_name\')

获取器常见场景以及基本使用

时间日期字段的格式化输出

集合或枚举类型的输出

数字状态字段的输出

组合字段的输出

// 状态值的转换输出 // 模型类 public function getStatusAttr($value) { $status = [-1=>\'删除\' , 0=>\'禁用\' , 1=>\'正常\' , 2=>"待审核"]; return $status[$value]; } // 控制端 $user = model\UserModel::find(19); return $user->status;

通俗理解:

在控制端正常的查看字段值,模型类定义一个获取器(一个字段可以对应一个模型类中的特殊方法获取器方法)),获取器就会对控制端的字段查询进行获取并进行自定义的处理方法。

获取器还可以定义数据表不存在的字段,在控制端用户可以正常的按照字段名读取的方式来访问

<?php namespace app\model; use think\Model; class User extends Model { public function getStatusTextAttr($value,$data) { $status = [-1=>\'删除\',0=>\'禁用\',1=>\'正常\',2=>\'待审核\']; return $status[$data[\'status\']]; } }

获取器方法的第二个参数传入的是当前的所有数据数组。

我们就可以直接使用status_text字段的值了,例如:

$user = User::find(1); echo $user->status_text; // 例如输出“正常”

这里也就是为了解决多种处理方法并规避冲突的写法;因为如果获取器定义以后就无法在控制端获原始的字段值,不过也还有另外一种getData()方法获得原始字段值:

$user = User::find(1); // 通过获取器获取字段 echo $user->status; // 获取原始字段数据 echo $user->getData(\'status\'); // 获取全部原始数据 dump($user->getData()); 动态获取器

可以支持对模型使用动态获取器,无需在模型类中定义获取器方法,在控制端使用动态获取器:

$user = model\UserModel::find(19) ->withAttr(\'status\',function($value,$data){ $status = [ -1=>\'删除\',0=>\'禁用\', 1=>\'正常\',2=>\'待审核\' ]; return $status[$value]; }); echo $user->status;

withAttr方法支持多次调用,定义多个字段的获取器。另外注意,withAttr方法之后不能再使用模型的查询方法,必须使用Db类的查询方法。

模型修改器

模型修改器的左右:对模型设置对象的值进行处理
在新增数据的时候,可以利用修改器对数据进行格式化、转换等处理;处理数据新增,还有数据更新也可能触发修改器

模型修改器命名规范:

setFieldNameAttr()

ps:修改器只对模型方法有效

public function setEmailAttr($value) { return strtolower($value); } $user = model\UserModel::create([ \'username\' => \'李白\', \'password\' => \'123\', \'gender\' => \'男\', \'email\' => \'LIBai@163.com\', \'price\' => 100, \'details\' => \'123\', \'uid\' => 1011 ], [\'username\', \'password\', \'details\',\'email\'], false); echo $user->save(); 查询范围

在模型类创建一个封装的查询和写入方法,有便于控制端调用

查询封装方法 scope()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdsyy.html