ThinkPHP6 模型使用--模型修改

358 阅读1分钟

先查询再修改场景:

  1. 多条查询,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,谨慎使用