先查询再修改场景:
- 多条查询,select
//select查询多条数据场景 select 返回think\model\Collection对象
/** @var Collection $news **/
$news = \app\admin\model\News::where('EI_Id', 'in', ['37626784014932', '37625818730363'])->select();
//批量修改1.
$news->each(function (\app\admin\model\News $item) {
//item 为模型对象
$item->save(['EI_State' => -1]);
});
//批量修改2 调取结果集Collection对象的update方法
$news->update(['EI_State' => -1]);
2.单条查询场景 find
//find查询单条数据场景 find 返回模型对象
$news = \app\admin\model\News::where('EI_Id', '=', '37625818730363')->find();
//1
$news->data([
'EI_State' => -1
], true);
//注意此时模型赋值并没有插入数据库
//save方法就是将赋值好值的字段插入数据库
//模型新增:save 成功返回1
$news->save();
//2
$news->save(['EI_State' => -1]);
直接修改场景:
1.使用静态方法::update()更新,返回的是对象实例
//数据修改,不查询直接修改场景 模型update方法中会创建新模型实例对象
//$model = new static();
\app\admin\model\News::update([
'EI_State' => -1
], [
'EI_Id', 'in', ['37626784014932', '37625818730363']
]);
//或者
Students::update([ 'id' =>14, 'uname' =>'name' ] ); //id为主键
2.通过saveAll()方法批量更新数据,只需要在批量更新的数据中包含主键即可,
批量更新方法返回的是一个
数据集对象。
批量更新仅能根据主键值进行更新,其它情况请自行处理。
$user = new User;
$list = [
['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com']
];
$user->saveAll($list);
错误使用场景:方法乱使用,单条查询(find查询返回模型对象)后,调用模型update方法
//find查询单条数据场景 find 返回模型对象
/** @var $news \app\admin\model\News **/
$news = \app\admin\model\News::where('EI_Id', '=', '37625818730363')->findOrEmpty();
//类对象->静态方法 //可以 update为静态方法,类对象可以调用,而不是调用Model类的__call方法
$news->update([
['EI_State' => -1]
]);
/**
* 模型类中的update方法,更新数据
* @access public
* @param array $data 数据数组
* @param mixed $where 更新条件
* @param array $allowField 允许字段
* @return static
*/
public static function update(array $data, $where = [], array $allowField = [])
{
$model = new static();
if (!empty($allowField)) {
$model->allowField($allowField);
}
if (!empty($where)) {
$model->setUpdateWhere($where);
}
$model->exists(true)->save($data);
return $model;
}
如上示例中,$news类型为News模型,$news->update()后,在update()方法中,创建了新的News对象,是对新对象进行update操作,不是对原来的News对象修改。新对象中没有where查询条件(除非$data中包含主键,会将主键放入查询条件),$data中无主键时,update操作会针对全表update,谨慎使用