Где воздух гор - там тишина снегов, молчание камней и дремлет сила

Программирование Web

Импорт данных из CSV/Excell файла в Laravel 8

2021-08-15 19:24:14






В более ранних версиях Laravel импорт данных из файлов тип CSV/Excell существовал и ранее. Сейчас процесс импорта несколько изменился и мы рассмотрим его здесь:


Для начала установим необходимы пакет.


1. /var/www/cvdt$ sudo composer require maatwebsite/excel
Continue as root/super user [yes]? yes
Using version ^3.1 for maatwebsite/excel
./composer.json has been updated
Running composer update maatwebsite/excel
Loading composer repositories with package information
Updating dependencies
Lock file operations: 8 installs, 0 updates, 0 removals
 - Locking ezyang/htmlpurifier (v4.13.0)
 - Locking maatwebsite/excel (3.1.31)
 - Locking maennchen/zipstream-php (2.1.0)
 - Locking markbaker/complex (2.0.3)
 - Locking markbaker/matrix (2.1.3)
 - Locking myclabs/php-enum (1.8.0)
 - Locking phpoffice/phpspreadsheet (1.18.0)
 - Locking psr/http-factory (1.0.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 8 installs, 0 updates, 0 removals
 - Downloading psr/http-factory (1.0.1)
 - Downloading markbaker/matrix (2.1.3)
 - Downloading markbaker/complex (2.0.3)
 - Downloading myclabs/php-enum (1.8.0)
 - Downloading maennchen/zipstream-php (2.1.0)
 - Downloading ezyang/htmlpurifier (v4.13.0)
 - Downloading phpoffice/phpspreadsheet (1.18.0)
 - Downloading maatwebsite/excel (3.1.31)
 - Installing psr/http-factory (1.0.1): Extracting archive
 - Installing markbaker/matrix (2.1.3): Extracting archive
 - Installing markbaker/complex (2.0.3): Extracting archive
 - Installing myclabs/php-enum (1.8.0): Extracting archive
 - Installing maennchen/zipstream-php (2.1.0): Extracting archive
 - Installing ezyang/htmlpurifier (v4.13.0): Extracting archive
 - Installing phpoffice/phpspreadsheet (1.18.0): Extracting archive
 - Installing maatwebsite/excel (3.1.31): Extracting archive
4 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: maatwebsite/excel
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
77 packages you are using are looking for funding.
Use the `composer fund` command to find out more!


Далее мы настроим пакет для использования в файле «config/app.php».Пропишем в нем настройки:


2.

'providers' => [


Maatwebsite\Excel\ExcelServiceProvider::class,

],



'aliases' => [


'Excel' => Maatwebsite\Excel\Facades\Excel::class,

],

];


3. Теперь мы создадим новую модель, в которую мы поместим наши данные. После генерации модели, отредактируем файл миграции:

/var/www/cvdt$ sudo php artisan make:model Report -m
Model created successfully.



<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateReportsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('reports', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id')->nullable()->change();

$table->dateTime('report_date')->unique()->nullable()->change();
$table->integer('productAdId')->unique()->nullable()->change();
$table->unsignedBigInteger('keywordId')->unique()->nullable()->change();
$table->integer('adGroupId')->nullable()->change();
$table->integer('adGroupId')->nullable()->change();
$table->string('asin', 255)->unique()->default(0);
$table->string('sku', 255)->unique()->default(0);
$table->string('query', 255)->unique()->nullable()->change();
$table->string('placement', 50)->default(0);
$table->integer('impressions')->nullable()->change();
$table->float('averageImpressionPosition', 8, 2)->nullable()->change();
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');

});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('reports');
}
}


Наша вновь созданная таблица буде связана с таблицей «users»,после чего запустим скрипт миграции:

var/www/cvdt$ sudo php artisan migrate
Migrating: 2021_06_26_121043_create_reports_table
Migrated:  2021_06_26_121043_create_reports_table (54.54ms)


4. После этого мы создадим новый контроллер, в котором будет обработка данных импорта:

alexander@AllMyLands:/var/www/cvdt$ sudo php artisan make:controller ReportsController
Controller created successfully.



После чего нам нужно создать новую опцию import c помощью специальной команды:


/var/www/cvdt$ sudo php artisan make:import ReportsImport --model=Report        
Import created successfully.

В ней мы заполним метод «model» структурой данных, которые мы будем импортировать.

<?php

namespace App\Imports;

use App\Models\Report;
use Maatwebsite\Excel\Concerns\ToModel;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class ReportsImport implements ToModel
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new Report([

'user_id' => $row[0],
'profile_id' => $row[1],
'report_request_id' => $row[2],
'record_type' => $row[3],
'productAdId' => $row[4],
'keywordId' => $row[5],
'campaignId' => $row[6],
'adGroupId' => $row[7],
'asin' => $row[8],
'sku' => $row[9],
'query' => $row[10],
'placement' => $row[11],
'impressions' => $row[12],
'created_at' => $row[38],
'updated_at' => $row[39],

]);
}
}

Точно такую, зеркальную структуру напишем в нашей модели

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Report extends Model
{
use HasFactory;

protected $fillable = ['user_id',
'profile_id',
'report_request_id',
'record_type',
'report_date',
'productAdId',
'keywordId',
'campaignId',
'adGroupId',
'asin',
'sku',
'query',
'placement',
'impressions',
'created_at',
'updated_at'];


}

5. На ReportsController будет иметь пару методов, - один для формы импорта, а другой обработки данных.Но сначала мы подключим пакет «Maatwebsite\Excel» и опцию импорта:

use Maatwebsite\Excel\Facades\Excel;
use App\Imports\ReportsImport;

Затем в папке «resources/views/reports/» сделаем новую веб-форму для импорта файлов.Это будет метод «index»:

<!DOCTYPE html>
<html>
<head>
<title>{{ config('app.name', 'Laravel') }}</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" />
</head>
<body>
<div class="container">
<div class="card bg-light mt-3">
<div class="card-header">
Import Report from CSV/Excell file:
</div>
<div class="card-body">
<form action="{{ route('import_csv') }}" method="POST" enctype="multipart/form-data">
@csrf
<input type="file" name="file" class="form-control">
<br>
<button class="btn btn-success">Import Data</button>
</form>
</div>
</div>
</div>
</body>
</html>


Другой метод будет для обработки этой формы:

public function import_csv() {

Excel::import(new ReportsImport,request()->file('file'));

return redirect()->back()->with('success', 'Data saved successfully!');

}

В итоге класс контроллера будет выглядеть таким образом:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\ReportsImport;
use App\Models\Report;
use Auth;
use DataTables;

class ReportsController extends Controller
{


public function __construct(){

$this->middleware('auth');

}


public function index() {

return view('reports.index');

}


public function import_csv() {

Excel::import(new ReportsImport,request()->file('file'));

return redirect()->back()->with('success', 'Data saved successfully!');

}


}


6. Напоследок добавим необходимые пути в файл роутера:


Route::get('index', [App\Http\Controllers\ReportsController::class, 'index'])->name('index');
Route::post('import_csv', [App\Http\Controllers\ReportsController::class, 'import_csv'])->name('import_csv');
;

На этом все, наше приложение готов к использованию.

Здесь нет комментариев


Новый комментарий:
























Яндекс.Метрика