我正在使用 updateOrInsert 在数据库中插入行,或在行已存在的情况下对其进行更新。
从手册中: https://laravel.com/docs/5.8/queries
更新或插入 有时,您可能希望更新数据库中的现有记录,或者如果不存在匹配的记录,则创建它。在这种情况下,可以使用updateOrInsert方法。 updateOrInsert方法接受两个参数:用于查找记录的条件数组,以及包含要更新的列的列和值对的数组。
updateOrInsert方法将首先尝试使用第一个参数的列和值对查找匹配的数据库记录。如果记录存在,它将使用第二个参数中的值进行更新。如果找不到该记录,则将插入具有两个参数的合并属性的新记录:
就我而言,我不想覆盖(更新)所有列,而只是覆盖updated_at列。
在MySql中,我使用INSERT和ON DUPLICATE KEY UPDATE指定仅要更新的列。
如何使用 updateOrInsert 在Laravel中执行此操作?感谢您的任何建议。
DB::table('products')->updateOrInsert(
['upc' => $request->get('upc'),],
['upc' => $request->get('upc'),
'name' => $request->get('name'),
'created_at' => ...,
'updated_at' => ...]
);
答案 0 :(得分:2)
如果查看查询生成器的代码,您会看到Laravel也正在执行两个查询:
/**
* Insert or update a record matching the attributes, and fill it with values.
*
* @param array $attributes
* @param array $values
* @return bool
*/
public function updateOrInsert(array $attributes, array $values = [])
{
// See if record exists (query 1)
if (! $this->where($attributes)->exists()) {
// Do an insert (query 2)
return $this->insert(array_merge($attributes, $values));
}
// Do an update (query 2)
return (bool) $this->take(1)->update($values);
}
您可以复制此代码并更改:
return (bool) $this->take(1)->update($values);
到
return (bool) $this->take(1)->update(['updated_at' => '2019-08-31 12:34:45']);
如果您确实想使用INSERT with ON DUPLICATE KEY UPDATE
,则应使用RAW查询。 Laravel查询构建器不支持仅MySQL方法。
原始查询应如下所示:
DB::statement('INSERT INTO `products` (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE `updated_at` = NOW();');
答案 1 :(得分:0)
如果我正确理解了您的问题,则应在查询中指定重复的列并更新其updated_at
列。例如。
DB::table('products')->where('duplicate_key', 'duplicate_value')->updateOrInsert(
['updated_at' => Carbon::now()],
);
答案 2 :(得分:0)
尝试此更新
products::where('id', $id)->update(['upc' => $request->input('upc'), 'upc' => $request->get('upc'),'name' => $request->get('name')]);
return redirect()->back();