Я пишу импортер 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 (естественно) .
Посоветуйте, пожалуйста, более элегантное решение.