簡體   English   中英

Laravel 8 upsert 與 DB::Raw 查詢

[英]Laravel 8 upsert with DB::Raw query

我希望使用 Laravel 8 的原生 upsert 功能來導入一批產品。 當使用包https://github.com/staudenmeir/laravel-upsert 時,我可以例如只使用以下內容來更新數據庫模型中不存在的圖像:

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 的 upsert 版本中似乎不起作用。 關於我如何做到這一點的任何想法?

更新:我目前正在嘗試的代碼是:

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

Coalesce 將采用列的值或傳遞的值,具體取決於是否為空

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM