PHP Laravel импорт и обновление списка продуктов с уникальным ключом - PullRequest
0 голосов
/ 04 мая 2020

Я пишу импортер CSV для добавления / обновления списка продуктов в БД. Список товаров должен иметь стабильные идентификаторы, поэтому важно обновлять записи, а не удалять и добавлять новые. Также в фиде продукта могут быть дубликаты продуктовых линеек, мне нужна только самая старая запись даты для конкретного продукта (поле «import_key» контролирует это).

Модель Продукт имеет поля:

id          - incremental integer, which is DB primary key
merchant_id - merchant id
pid         - product id in merchant database (unique for particular merchant, not unique globally)
// Ten other properties here
import_key  - date field.

pid + merchant_id является уникальным ключом

    Product::whereMerchantId(self::MERCHANT_ID)
      ->update(['import_key' => NULL]);

    $csv_data = array_map('str_getcsv', explode("\n", $curl_result));
    foreach ($csv_data as $data) {
        $product=new Product();
        $product->merchant_id = self::MERCHANT_ID;
        $product->pid=$data[1];
        $product->name=$data[2];
        // Ten properties assigned here
        $product->import_key=$data[13];

        $old_product = Product::whereMerchantId(self::MERCHANT_ID)
          ->wherePid($product->pid)->first(); // unique key test

        if ($old_product === null) {
            $product->save();  // I have new merchant+pid
        } else {
            if ($old_product->import_key==NULL || $old_product->import_key>$product->import_key) {
                // updating old record or we have found older date record in file for this product
                $old_product->name=$product->name;
                // Ten properties assigned here
                $old_product->import_key=$product->import_key;
                $old_product->update();
            }
        }
    }

Проблема в том, что в коде у меня есть 10 назначаемых строк (что нормально) и 10 строк обновления, которых я бы хотел избежать. Я попробовал это, но безуспешно (без ошибок, но запись не обновляется в БД).

    if ($old_product->import_key==NULL || $old_product->import_key>$product->import_key) {
        $product->id=$old_product->id;
        $product->update();
    }

Если вместо обновления использовать $product->save(), то возвращается ошибка «Дублирующий ключ» SQL (естественно) .
Посоветуйте, пожалуйста, более элегантное решение.

...