我有一个表 ice_cream
,其中包含两列:primary_key user_id
和 int counter
,默认值为 0。
我想插入一个user_id
,其counter
值为1
,并在重复时增加counter
。
我正在寻找适用于 MySQL 和 SQLite 的 Laravel Database Builder 5.6 版解决方案。
对于 MySQL 我有这个解决方案:
IceCream::updateOrCreate([
'user_id' => $user_id,
],
[
'counter' => \DB::raw('counter + 1'),
]);
但是,这不适用于 SQLite。我收到以下错误消息:
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such column: counter (SQL: insert into "ice_cream" ("user_id", "counter") values (12,counter + 1))
对于 SQLite,我还有一个自定义解决方案:
\DB::select(\DB::raw('INSERT OR IGNORE INTO ice_cream (user_id,counter) VALUES (?,0) '), [$user_id]);
\DB::select(\DB::raw("UPDATE ice_cream SET counter = counter + 1 WHERE user_id= ?"), [$user_id]);
但是这不适用于 MySql。
自 Laravel v5.8.33 版本以来,有一个通用的 insertOrIgnore
方法,但我目前使用的是 Laravel v5.6,目前无法更新。
是否可以创建一种适用于两者的解决方案?
最佳答案
找到了一种同时适用于 MySQL 和 SQLite 的方法:
$iceCream = static::firstOrNew([
'user_id' => $user_id,
],
['counter' => 0]);
$iceCream->counter++;
$iceCream->save();
关于php - SQLite 和 MySQL 的重复列增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58400987/