Php - Вставить несуществующие данные и запретить существующие данные в Laravel Excel - PullRequest
0 голосов
/ 13 января 2020

Я знаю, что это маленькая легкая логика c, но для меня это сложная задача. Я использую Laravel Excel от https://laravel-excel.com/

У меня есть файл CSV, который имеет такие данные, как: https://i.ibb.co/WfLZbVd/1.png

I хотите импортировать некоторые CSV и проверить существующие данные и не вставлять их в базу данных. Но я хочу вставить данные, которых не было в базе данных, и я не знаю, как их проверить.

Я просто хочу вставить новые данные вместе и запретить старые. И почему я это делаю? Это сделано для предотвращения дублирования данных после импорта CSV в базу данных и уменьшения человеческих ошибок.

У меня есть пример кода, подобный следующему:

<?php

namespace App\Imports\Points;

use App\Models\PointRegular;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\Importable;

class PointsRegularImport implements ToCollection, WithHeadingRow
{
    use Importable;

    public function collection(Collection $rows)
    {
        foreach($rows as $row) {
            // Check existing data in database
            $pointRegulars = PointRegular::orderBy('created_at', 'desc')
            ->where('product_id', $row['product_id'])
            ->where('channel_id', $row['channel_id'])
            ->where('transaction_type_id', $row['transaction_type_id'])
            ->where('payment_method_id', $row['payment_method_id'])
            ->get();

            foreach($pointRegulars as $pointRegular) {
                // Check for update data with id
                if($row->has('id')) {
                    if($pointRegular->id == $row['id']) {
                        $point = PointRegular::findOrFail($row['id']);
                        $point->product_id = $row['product_id'];
                        $point->channel_id = $row['channel_id'];
                        $point->transaction_type_id = $row['transaction_type_id'];
                        $point->payment_method_id = $row['payment_method_id'];
                    }
                } else {
                    // Create new data
                    // Check for data existed in database
                    // If exist, deny existed data and insert new data
                    if($pointRegular) {
                        return "Existed and not insert";
                    } else {
                        return "You Inserting new data without creating the old one";
                    }
                }
            }
        }
    }
}

Я просто хочу вставить новый данные и отрицание старых данных.

Спасибо за помощь.

1 Ответ

0 голосов
/ 13 января 2020

Использование updateOrCreate с красноречивой ссылкой здесь

function updateOrCreate(array $attributes, array $values = []){}
...