更新的最佳实践原则是:如果需要使用模型事件,那么就先查询后更新,如果不需要使用事件或者不查询直接更新,直接使用静态的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()