雄辩的模型更新更多的行,它应该laravel php

mm9b1k5b  于 2023-02-10  发布在  PHP
关注(0)|答案(2)|浏览(133)

我有一个没有主键的表,如下所示:
| 用户标识|配置密钥|配置值|
| - ------|- ------|- ------|
| 小行星2296|配置密钥1|配置值1|
| 小行星2296|配置密钥2|配置值2|
| 小行星2296|配置密钥3|配置值3|
| 小行星2296|配置密钥4|配置值4|
每当我试图更新表中的一个值时,出于某种原因,表的其余部分也会更新为相同的值,如下所示:
| 用户标识|配置密钥|配置值|
| - ------|- ------|- ------|
| 小行星2296|配置密钥1|配置值1|
| 小行星2296|配置密钥2|配置值1|
| 小行星2296|配置密钥3|配置值1|
| 小行星2296|配置密钥4|配置值1|
我的查询如下所示:

$ConfigValue = AppUserConfig::where('user_id', 2296)
                ->where('config_key', 'config_key_1')
                ->first();
$ConfigValue->config_value = config_value_1;
$ConfigValue->save();

我只需要更新表中的一行,如下所示:
| 用户标识|配置密钥|配置值|
| - ------|- ------|- ------|
| 小行星2296|配置密钥1|配置值1|
| 小行星2296|配置密钥2|配置值2|
| 小行星2296|配置密钥3|配置值3|
| 小行星2296|配置密钥4|配置值4|
对此:
| 用户标识|配置密钥|配置值|
| - ------|- ------|- ------|
| 小行星2296|配置密钥1|新自定义值|
| 小行星2296|配置密钥2|配置值2|
| 小行星2296|配置密钥3|配置值3|
| 小行星2296|配置密钥4|配置值4|
但不确定发生了什么:(
两种解决方案都差不多解决了,谢谢大家。

pxyaymoc

pxyaymoc1#

这并不奇怪,当你使用Eloquent更新一个记录时,你的update语句会使用主键来标识那个记录,我们可以假设它试图更新所有id为2296的行。你可以使用像clockworktelescope这样的调试工具来验证你运行代码时的实际SQL语句查询
您也可以尝试使用Query builder更新语句,例如:

DB::table('app_user_config_whatever')
    ->where('user_id', 2296)
    ->where('config_key', 'config_key_1')
    ->update(['config_value' => 'config_value_1']);

但是最好的方法是在用户和配置之间创建一个适当的关系,比如让配置belognsTo成为一个用户,然后您可以执行类似于

$user->config()
    ->where('config_key', 'config_key_1')
    ->update(['config_value' => 'config_value_1']);

$user->config()
    ->updateOrCreate( 
        ['config_key' => 'config_key_1' ], 
        ['config_key' => 'config_key_1', 'config_value' => 'config_value_1'] 
    );
sr4lhrrt

sr4lhrrt2#

你可以通过使用更新查询来更新,如下所示

$ConfigValue = AppUserConfig::where('user_id', 2296)
                ->where('config_key', 'config_key_1')
                ->update(['config_value'=>'config_value_1']);

相关问题