2015-11-17 12:05:05 44973次浏览 4条回答 1 悬赏 15 金钱

RT,之前一直以为 ActiveRecord->save 方法 可以当数据不存在时 insert,存在时update,后来在中文官网上看到了这段文档:

// 新建一条记录
$model = new Customer;
if ($model->load(Yii::$app->request->post()) && $model->save()) {
    // 获取用户输入的数据,验证并保存
}

// 更新主键为$id的AR
$model = Customer::findOne($id);
if ($model === null) {
    throw new NotFoundHttpException;
}
if ($model->load(Yii::$app->request->post()) && $model->save()) {
    // 获取用户输入的数据,验证并保存
}

按照这个逻辑,我现在如果想更新id = 100这条数据信息,如果数据表中没有这条记录,那么$model === null,如此一来,还得先判断,如果为空,实例化一个 $model,然后:

$model = new Customer();
$model->id = 100;
.....

感觉这样不够优雅,还是说我对ActiveRecord的理解有问题?

最佳答案

  • 500miles 发布于 2015-11-17 12:57 举报

    首先, 你理解的没错儿.

    只不过, 大部分业务逻辑中 ...
    如果update, 通常是取出数据, 然后做一些操作, 最后修改数据后再save(此时就是update)
    此种情况下, 如果按条件取不到数据, 往往意味着 : 哪里出了问题?, 404?,

    于是抛出异常或者其他处理措施......

    你想要的 其实就是这种情况的处理措施之一 : 取不到数据, 我不抛异常, 不给404 我直接新建一条..

    最后 感觉这样不够优雅.
    你可以自己加一个方法来扩充ActiveRecord. 比如 : updateOrInsert()
    这样似乎会友好, 优雅一点

    , , , , 觉得很赞
  • 回答于 2015-11-24 23:42 举报

    理解没错 BD

  • 回答于 2016-03-04 17:14 举报

    为什么我执行$model->save();方法的时候,总是执行插入操作?比如我要进行更新操作,我先建了一个model ModifyForm.php,并在里面定义了相应的规则,model里面写了doModify这个方法,里面通过new Admin()这个数据表,并对要改变的值进行重新赋值,再执行save()方法,在控制器这端引用这个model,if($model->load(Yii::$app->request->post()) && $model->validate()){$user = $model->doModify($id);if($user){return $this->redirect(['user/index']);}}执行后直接是空白页。这是怎么回事呢?网上找了很多更新的方法,都不行。

    1 条回复
    回复于 2016-12-14 21:03 回复

    new一个就是插入数据,::model就是update操作

  • 回答于 2017-08-31 11:05 举报

    你可以直接$model = new Customer(); $model->id = 100;这样save不就可以update啦?

    1 条回复
    回复于 2020-01-10 10:49 回复

    云开发~~

您需要登录后才可以回答。登录 | 立即注册
蛮荆
经理

蛮荆

注册时间:2015-02-04
最后登录:2023-10-20
在线时长:24小时11分
  • 粉丝5
  • 金钱1380
  • 威望0
  • 积分1620

热门问题