【问题标题】:Laravel eloquent update column value by adding new valueLaravel eloquent 通过添加新值来更新列值
【发布时间】:2017-12-06 18:05:36
【问题描述】:

我正在使用 updateOrCreate() 方法来更新当前用户的积分:

   $point->updateOrCreate(
        ['user_id' => auth()->id()],
        ['score' => request('totalScore')]
    );

如果request('totalScore')是50,而score列的当前值是10,我想update它是60。但是如你所见,上述方法直接将10替换为50。

Google 搜索返回的结果包含查询构建器的 increment() 方法。但我不必在整个应用程序中使用查询生成器。为什么我现在要使用它?是否可以使用 Eloquent 方法更新值?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    “由于 Eloquent 模型是查询构建器,因此您应该查看查询构建器上所有可用的方法。您可以在 Eloquent 查询中使用这些方法中的任何一种。”

    Laravel 5.5 Docs - Eloquent - Retrieving Models

    您可以使用 Eloquent 来使用任何 Query Builder 方法或任何 Eloquent 特定方法。

    【讨论】:

    • 好吧 updateOrCreate 返回一个模型,而不是构建器,但是如果您想在该模型实例上增加一个字段,它有自己的 increment 方法,您可以调用
    • 知道了。我正在更新你的答案。如果我做错了什么,请告诉我。
    • 当我使用新用户 ID 尝试此操作时出现此错误:``` SQLSTATE[HY000]:一般错误:1364 字段'score'没有默认值(SQL:插入@ 987654324@ (user_id, updated_at, created_at) 值 (5, 2017-12-06 19:38:07, 2017-12-06 19:38:07)) ```
    • 你设计的模式说它需要一个值..那么你需要给它一个值或设置一些默认值
    • 刚刚以各种可能的方式进行了测试,我可以向您保证,分数的值正在正确传递。该语句应该使用新的 user_id 创建一个新行,或者如果已经找到具有当前 user_id 的行,则应该更新 score 列...
    【解决方案2】:

    上一个答案有问题(参见 cmets)。所以我不得不想出另一个解决方案。我在我的模型中创建了一个名为 updateOrCreateAndIncrement()local query scope

    public function scopeUpdateOrCreateAndIncrement($query, $totalScore){
            if(!$query->where('user_id',auth()->id())->first()){
                $query->create(['user_id' => auth()->id(), 'score' => $totalScore]);
            } else {
                $query->where('user_id',auth()->id())->increment('score', $totalScore);
            }
        }
    

    并且在控制器update() 方法中,我可以轻松调用$point->updateOrCreateAndIncrement()

    public function update(Request $request, Points $point){
        $point->updateOrCreateAndIncrement(request('totalScore'));
    }
    

    【讨论】:

    • 它不是现实中的范围(因为它们用于将约束添加到作为构建器的查询中)...只需在您的模型或宏上创建一个常规方法到 Eloquent\Builder
    • 附带说明一下,除了查询之外,我还可以在哪些内容上创建宏?
    • 我在底部附近有一个小列表:asklagbox.com/blog/laravel-macros ... 这是不完整的,因为我确信从 5.5 开始,更多的类现在具有此功能
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多