在laravel中用不同的值批量更新表[settings]

9udxz4iz  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(388)

我需要一种更好的方法来更新表,例如:

|name           |value
--------------------------------------
|cache_lifespan |240
|idle_time      |900
|jump_menu      |1
|listing        |25
|system_off     |1

以上是设置值,我把它们放在一个窗体中,有权限的用户可以更新它们。我在模型“setting”中使用以下方法来更新每个设置值,但我觉得这不是最好的方法。

public function updateSettings($fields)
{
    Setting::where('name', 'system_off')->update(['value' => $fields['system_off']]);
    Setting::where('name', 'listing')->update(['value' => $fields['listing']]);
    Setting::where('name', 'jump_menu')->update(['value' => $fields['jump_menu']]);
    Setting::where('name', 'cache_lifespan')->update(['value' => $fields['cache_lifespan']]);
    Setting::where('name', 'idle_time')->update(['value' => $fields['idle_time']]);

    cache()->forget('settings');

}

我试着用一个查询来更新所有设置。

p5cysglq

p5cysglq1#

因为您试图用不同的条件和不同的值更新同一个表,所以这是不可能的。
此外,您还尝试更新许多项,并且必须使用事务。
我可以建议你使用这个代码

$updatedColumns = ['system_off', 'listing', 'jump_menu', 'cache_lifespan', 'idle_time'];
DB::beginTransaction();
foreach ($updatedColumns as $column) {
    if (!Setting::where('name', $column)->update(['value' => $fields[$column]])) {
        DB::rollBack();        
    }
}
DB::commit();

如果不使用事务,可以使用此代码

$updatedColumns = ['system_off', 'listing', 'jump_menu', 'cache_lifespan', 'idle_time'];
foreach ($updatedColumns as $column) {
    Setting::where('name', $column)->update(['value' => $fields[$column]]);
}

相关问题