区别:
1、模型数据的新增和数据库的新增数据有所区别,数据库的新增只是单纯的写入给定的数据,而模型的数据写入会包含修改器、自动完成以及模型事件等环节。
2、开启自动时间戳只有在模型操作的时候生效,数据库是不生效。
3、模型返回id,数据表的字段名必须是"id",不然返回都是空值。
4、模型关联,替代了数据操作的join 链表步骤,加快了效率。
单条数据增加save()
$user = new User;
$user->name = 'thinkphp';
$user->email = '[email protected]';
$user->save();
批量增加数据saveALL()
$user = new User;
$list = [
['name'=>'thinkphp','email'=>'[email protected]'],
['name'=>'onethink','email'=>'[email protected]']
];
$user->saveAll($list);
静态方法增加数据create(),默认会过滤不是数据表的字段信息.
// 只允许写入name和email字段的数据
$user = User::create([
'name' => 'thinkphp',
'email' => '[email protected]'
], ['name', 'email']);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID
备注:新增和更新数据都用save(),更新数据只会更新变化的数据,对于没有变化的数据不会进行更新。
静态方法更新update(),第一个参数中包含主键数据,可以无需传入第二个参数
User::update(['name' => 'thinkphp', 'id' => 1]);
删除(函数delete() ,查询主键再调用)一般项目采用软删除。
静态方法删除
User::destroy(1);
// 支持批量删除多个数据
User::destroy([1,2,3]);
//备注:当destroy方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的
查询(在模型内部使用$this->getAttr('name')来获取值,不要$this->name来获取值)
单个查询
// 取出主键为1的数据
$user = User::find(1);
echo $user->name;
查询多个数据
// 根据主键获取多个数据
$list = User::select([1,2,3]);
数据分批处理
User::chunk(100, function ($users) {
foreach($users as $user){
// 处理user模型对象
}
});
备注:在模型外部使用静态方法进行查询,内部使用动态方法查询,包括使用数据库的查询构造器。
获取器:方法命名规范getFieldNameAttr();
'删除',0=>'禁用',1=>'正常',2=>'待审核'];
return $status[$value];
}
}
模型的数据对象取值操作($model->field_name);
模型的序列化输出操作($model->toArray()及toJson());
显式调用getAttr方法($this->getAttr('field_name'));
修改器:setFieldNameAttr()
搜索器:searchFieldNameAttr()
where('name','like', $value . '%');
}
public function searchCreateTimeAttr($query, $value, $data)
{
$query->whereBetweenTime('create_time', $value[0], $value[1]);
}
}
//先定义,后调用
User::withSearch(['name','create_time'], [
'name' => 'think',
'create_time' => ['2018-8-1','2018-8-5'],
'status' => 1
])
->select();
自动时间戳
// 开启自动写入时间戳字段 config/database.php
'auto_timestamp' => true,
备注:时间字段的自动写入仅针对模型的写入方法save()/update(),如果使用数据库的更新或者写入方法则无效。
//更新阅读数的时候不修改更新时间,可以使用isAutoWriteTimestamp
$user = User::find(1);
$user->read +=1;
$user->isAutoWriteTimestamp(false)->save();