Laravel中具有不同值的批量更新表[设置]

时间:2018-08-25 09:36:22

标签: php mysql laravel laravel-query-builder

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

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

以上是设置值,我以某种形式提供它们,具有特权的用户可以更新它们。我正在模型“设置”中使用以下方法来更新每个设置值,但我觉得这不是完美的方法。

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');

}

我试图找到一种方法来通过一个查询更新所有设置。

1 个答案:

答案 0 :(得分:1)

因为您尝试用不同的值更新具有不同条件的同一张表,所以是不可能的。
另外,您尝试更新许多项目,并且必须使用事务。
我可以建议您使用此代码

$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]]);
}