Laravel - 保存与更新

Posted

技术标签:

【中文标题】Laravel - 保存与更新【英文标题】:Laravel - save vs update 【发布时间】:2020-06-06 10:54:38 【问题描述】:

我想知道哪个是更新数据库记录的更好解决方案 - addResources1addresources2

首先我尝试了update 查询方法,因为它对我来说很清楚。第二个想法是,我正在构建模型,所以让我们使用它们然后保存。

你怎么看?

有几个类似的主题,但是他们说save() 只会插入一条新记录,在这种情况下它不是真的。

资源服务:

 namespace App\Services;

 use App\Resource as Resource;
 use Illuminate\Support\Facades\Auth;

 class ResourcesService
 

     public function addResources1($userId, $wood, $stone, $food, $gold)
     
         $resources = new Resource;
         $resources = $resources->where('userId', $userId)->update([
         'wood' => $wood,
         'stone' => $stone,
         'food' => $food,
         'gold' => $gold,
          ]);
      

      public function addResources2($userId, $wood, $stone, $food, $gold)
      
          $resources = new Resource;
          $resources = $resources->where('userId', $userId)->first();
          $resources->wood = $wood;
          $resources->stone = $stone;
          $resources->food = $food;
          $resources->gold = $gold;
          $resources->save();
      

资源模型:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Resource extends Model

    protected $table = 'resources';


【问题讨论】:

【参考方案1】:

这取决于您的用例。

1) SQL 查询量最少的是什么?

方法 addResources1 将使用 1 个 SQL 查询。

方法 addResources2 将使用 2 个 SQL 查询。一个用于获取记录,另一个用于更新记录。


2) 模型是否敏感? (例如is_admin bool 列)

如果它确实有敏感列,则不应将该列放在模型的 fillable 属性中,因此方法 addResources1 将失败。


3)在记录更新之后但在提交到数据库之前,我是否需要做其他事情?

在这种情况下,addResources2 将更适合您,因为除非执行 save() 并且在您完成所有其他业务逻辑之后,否则它不会提交。

【讨论】:

【参考方案2】:

Code Review 是 Stackexchange 网络更好的解决此类问题的站点。如果您对自己正在做的事情有信心,那么第一个样品就可以了。我说这是因为第二个示例将只更新数据库中的一行,即使有更多行具有相同的 userId 列值。如果你知道你的结构第一个样本更清楚,看看它是做什么的。此外,如果你设置模型之间的关系,你可以以某种方式链接它

$user->resources()->update(['wood' => $wood, 'stone' => $stone, 'food' => $food, 'gold' => $gold,]);

【讨论】:

以上是关于Laravel - 保存与更新的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 更新模型而不是保存新的

更新不起作用时 Laravel 保存(奇怪的行为)

模型保存或更新时 Laravel 尾随数据异常

Laravel 配置文件更新错误

Laravel Eloquent - 保存/更新相关的一对多关系数据

Laravel,更新密码,然后将旧密码保存在表格中