ユーザ用ツール

サイト用ツール


プログラム言語:php:laravel:csvアップロード

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
プログラム言語:php:laravel:csvアップロード [2021/01/25 17:00]
humolife 作成
プログラム言語:php:laravel:csvアップロード [2021/01/25 17:31] (現在)
humolife
行 1: 行 1:
-====== 【Laravel】CSVアップロード ====== +====== 【Laravel】CSVアップロード(インポート) ====== 
-CSVファイルアップロード時に、バリデーションチェックを行い、DBに登録する方法の一例。+CSVファイルアップロード、バリデーションチェックDBに登録する方法の一例。
 ===== config\site\csv.php ===== ===== config\site\csv.php =====
 コンフィグファイルに、csv の列に対応した DB カラム名の関連付けを定義する。 コンフィグファイルに、csv の列に対応した DB カラム名の関連付けを定義する。
行 107: 行 107:
 </code> </code>
 ===== app\Http\Controllers\SampleController.php ===== ===== app\Http\Controllers\SampleController.php =====
-以下、記事まめ途中+ajax の場合の例。\\ 
 +普通の POST 送信の場合は「return response()->json()」しているところを書き換えれば OK。
 <code> <code>
 +<?php
 +
 +namespace App\Http\Controllers;
 +
 +use App\Http\Controllers\Controller;
 +use Illuminate\Support\Facades\Validator;
 +
 +use DB;
 +
 +# models
 +use App\Models\Sample;
 +
 +# requests
 +use App\Http\Requests\Admin\SampleRequest;
 +
 +# libs
 +use App\Libs\SampleCsv;
 +
 +class SampleController extends Controller
 +{
 +    public function store(SampleRequest $request)
 +    {
 +        $sample_csv = new SampleCsv($request->file('csv')->path());
 +        $csv_data = $sample_csv->convertColumns();
 +
 +        $csv_errors = []; // エラーメッセージを格納
 +        $number_count = []; // number の重複チェック用
 +
 +        foreach ($csv_data as $key => $val) {
 +            $validator = Validator::make(
 +                $val,
 +                $sample_csv->validationRules(),
 +                $sample_csv->validationMessages(),
 +                $sample_csv->validationAttributes()
 +            );
 +
 +            if ($validator->fails() === true) {
 +                $csv_errors[$key] = $validator->errors()->all();
 +            }
 +
 +            $number = $val['number'];
 +
 +            $number_count[$number] = isset($number_count[$number])
 +                ? $number_count[$number] + 1
 +                : 1;
 +
 +            $sample = Sample::where('number', $number)
 +                ->first();
 +
 +            if (!is_null($sample)) {
 +                $csv_errors[$key][] = $number . ' は登録済みのNoです。';
 +
 +            } elseif ($number_count[$number] > 1) {
 +                $csv_errors[$key][] = 'No ' . $number . ' はcsvファイル内で重複しています。';
 +            }
 +        }
 +
 +        if (count($csv_errors) > 0) {
 +            $response = [];
 +            $response['message'] = 'The given data was invalid.';
 +            $response['errors'] = ['csv_errors' => $csv_errors];
 +            return response()->json($response, 422);
 +        }
 +
 +        try {
 +            DB::beginTransaction();
 +
 +            Sample::delete();
 +
 +            foreach ($csv_data as $val) {
 +                $sample = new Sample();
 +                $sample->fill($val);
 +                $sample->save();
 +            }
 +
 +        } catch (\Exception $e) {
 +            $log_message = var_export([
 +                    'message' => $e->getMessage(),
 +                    'file' => $e->getFile(),
 +                    'line' => $e->getLine(),
 +                ], true);
 +            \Log::channel('system_error')->info($log_message);
 +
 +            return response()->json(['status' => 'error']);
 +        }
 +
 +        DB::commit();
 +
 +        return response()->json(['status' => 'success']);
 +    }
 +}
 +</code>
 +===== app\Http\Requests\SampleRequest.php =====
 +<code>
 +<?php
 +
 +namespace App\Http\Requests;
 +
 +use Illuminate\Foundation\Http\FormRequest;
 +
 +class SampleRequest extends FormRequest
 +{
 +    public function authorize()
 +    {
 +        return true;
 +    }
 +
 +    public function rules()
 +    {
 +        return [
 +            'csv'               => [
 +                'bail',
 +                'required',
 +                'file',
 +            ],
 +        ];
 +    }
 +
 +    public function attributes()
 +    {
 +        return [
 +            'csv'               => 'csv',
 +        ];
 +    }
 +}
 </code> </code>
  
プログラム言語/php/laravel/csvアップロード.1611561603.txt.gz · 最終更新: 2021/01/25 17:00 by humolife