Laravel 8 upsert with DB::Raw query



我希望使用Laravel 8的原生upstart函数来导入一批产品。使用软件包时https://github.com/staudenmeir/laravel-upsert例如,当DB模型中不存在时,我可以使用以下内容来更新图像:

Product::upsert(
$values,
$target,
[
'image' => DB::raw("if(`image` is null, values(`image`), `image`)"),
// TODO: Add the other columns that should be updated.
]
);

然而,这似乎在Laravel 8的upstart版本中不起作用。关于我该怎么做有什么想法吗?

更新:我目前正在尝试的代码是:

ShopProduct::upsert(
$productArray,
['productcode'],
[
'image' => DB::raw("if(`image` is null, values(`image`), `image`)"),
]);

我得到的错误是:

SQLSTATE[HY000]: General error: 1 near "values": syntax error (SQL: insert into "shop_products" ("created_at", "image", "name", "productcode", "slug", "updated_at") values (2020-11-18 21:52:03, /var/folders/y_/whnvprxj6hx514qmgwj_lb740000gn/T/cf46d09ad8845c9ff742a9045090d252.png, tempora, 6011295759374531, tempora, 2020-11-18 21:52:03), (2020-11-18 21:52:03, /var/folders/y_/whnvprxj6hx514qmgwj_lb740000gn/T/d0842fcf4ea08a4dab9f82e9456fdd36.png, qui, 4024007178334, qui, 2020-11-18 21:52:03) on conflict ("productcode") do update set "image" = if(`image` is null, values(`image`), `image`), "updated_at" = "excluded"."updated_at")

我使用这个函数使事情变得更容易:

protected function coalesce(array $columnNames):array{
$columns = [];
foreach($columnNames as $value){
$columns["{$value}"] = DB::raw("COALESCE(`{$value}`,values(`{$value}`))");
}
return $columns;
}

ShopProduct::upsert(
$productArray,
['productcode'],
$this->coalesce(['image]));

合并将采用列的值或传递的值,具体取决于是否为null

最新更新