Laravel excel, update rows after save in DB

Viewed 13

Project in Laravel (9), and PHP (8.1).

I want to import an excel file and use maatwebsite/excel (3.1) package.

I can import a file, and save the file into the model, like this:

import class:

class BankTransfersHistoryImport implements ToModel, WithHeadingRow, WithValidation, WithBatchInserts
{
    use Importable;

    private $rows;

    public function __construct()
    {
        $this->rows = collect();
    }

/**
 * @param array $row
 *
 * @return \Illuminate\Database\Eloquent\Model|null
 */
    public function model(array $row)
    {
        $bankTransferHistory = new BankTransfersHistory([    
            'loanId' => $row['loanId'],
            'actionDate' => transformDate($row['actionDate']),
            'worth' => $row['worth'],
            .
            .
        ]);

        $this->rows->push($bankTransferHistory);
        return $bankTransferHistory;
    }

    /**
     * Returns Imported Data
     *
     * @return \Illuminate\Support\Collection
     */
    public function getImportedData(): \Illuminate\Support\Collection
    {
        return $this->rows;
    }

    public function headingRow(): int
    {
        return 2;
    }

    public function rules(): array
    {
        return [ 
            '*.loanId' => ['required', 'numeric'],
            ... some roles ...
        ];
    }
}

controller:

   public function store(Request $request)
    {
        $request->validate([
            'file' => 'required|mimes:xls,xlsx',
        ]);

        $file = $request->file('file');

        $import = new BankTransfersHistoryImport;

        try {
            // date validation
            $collection = $import->toCollection($file);
            ... some validation about the date ...

            $import->import($file);
            $getImportedData = import->getImportedData();
            ... check and update rows ...

            return [
                "message" => some message,
                "data" => [
                    some data
                ],
            ];

        } catch (\Maatwebsite\Excel\Validators\ValidationException$e) {
            $failures = $e->failures();

            foreach ($failures as $failure) {
                $failure->row(); // row that went wrong
                $failure->attribute(); // either heading key (if using heading row concern) or column index
                $failure->errors(); // Actual error messages from Laravel validator
                $failure->values(); // The values of the row that has failed.
            }
            return $failures;
      }

My question is:

If I can get the response of the file after saving the data, that will give me the data with the id of the row that was saved.

In some cases, I will have to update a row. That's why I would like to get the ID.

Now, in the check and update rows section, I update row by loanId + actionDate. I want it to be done by only ID.


something like this:

code: $getImportedData = import->getImportedData();

data will be like:

[
    {
        "id": 1,
        "loanId": 21001,
        "actionDate": "2020-01-02T00:00:00.000000Z",
        "worth": 2997.09,
        "offerId": 1,
    },
    {
        "id": 2,
        "loanId": 21002,
        "actionDate": "2020-01-02T00:00:00.000000Z",
        "worth": 3000,
        "offerId": 10,
    },
]
0 Answers
Related