Не импортировать строку, если она уже существует в базе данных - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу импортировать элементы из моего CSV-файла в базу данных MSSQL с помощью Laravel 5.7.В моем CSV-файле первый столбец - item_ids, а второй - описание.Как теперь настроить, чтобы не загружать те элементы, идентификаторы которых уже есть в базе данных?ItemController:

public function import(Item $item, Request $request)
    {
        if ($request->hasFile('itemsfile')) {
            if ($request->itemsfile->getClientOriginalExtension() == 'csv')
            {
                $rowCount = 0;
                $csvAsArray = array_map(function($v){return str_getcsv($v, ";");}, file($request->file('itemsfile')));
                foreach($csvAsArray as $row)
                {
                    if(count($row)>=2){
                        if(trim($row[0]) != '' && trim($row[1]) != '') {
                            $item= new Item();
                            $item->item_id= $row[0];
                            $item->description= $row[1];
                            $item->save();
                            $rowCount++;
                        }
                    } else {
                    }
                }
                return redirect()->route('admin.items');
            }
            else {
                return back();
            }
        }
        else {
            return back();
        }
    }

ItemRequest:

public function rules()
    {
        return [
            'item_id' => 'required|unique:items'
        ];
    }

Когда я добавляю новый элемент (не импортирую его), проверка уникального номера идентификатора работает нормально, но когда я хочу импортировать пакеты изФайл CSV и не импортируйте строки, которые уже находятся в базе данных, весь CSV импортируется.Спасибо за помощь!dd (csvAsArray);

массив: 30 [▼ 0 => массив: 2 [▼ 0 => "Desc 1" 1 => "123456789"] 1 => массив: 2 [▶],,,и т. д.

1 Ответ

0 голосов
/ 20 сентября 2018

Вам необходимо проверить, есть ли эти данные в базе данных:

if(Item::where('item_id','=',$row[0])->count() == 0) {
    $item= new Item();
    $item->item_id= $row[0];
    $item->description= $row[1];
    $item->save();
    $rowCount++;
}

Также, если у вас есть уникальное правило, вы должны сделать то же самое в вашем файле миграции.У вас может быть что-то вроде этого:

Schema::create('Item', function (Blueprint $table) {
    $table->integer('item_id');
});

Затем создайте новую миграцию с уникальным правилом

Schema::table('Item', function (Blueprint $table) {
    $table->unique('item_id'); //add unique rule
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...