【Laravel】CSVのデータを読み込んでバリデーションをする方法

 こんにちわ、いよいよ春到来で外に出るのが楽しくてしょうがないHashiです。今回は先日紹介したLaravelでCSVファイルを読み込む方法に関連して、読み込んだデータをバリデーションする方法を備忘録も兼ねて紹介したいと思います。

 なお、Laravelとはなんぞやという方は下の記事を参照してください!

環境

 今回の環境は下記の通りとなります。

今回の環境

  • Laravel 5.5
  • MySQL 5.6.37

仕様と要点

 まず、今回のサンプルの仕様と要点、簡単な流れを下記に簡単にまとめます。(基本的には先日の記事を踏襲)

  • CSVのデータには、行ごとに「名前」と「メールアドレス」が記載されている
  • CSVは「Goodby CSV」ライブラリを使用してパース
  • パースしたデータをバリデーション
  • パースしたデータをDB(samplesテーブルと仮定)に保存
  • samplesテーブルには「name」と「email」フィールドが存在する

CSVのインポート(読み込み)

 まず、今回は先日の記事の内容、およびソースに追記する形で進めるので、先日の記事(下記記事)を参照してください。

読み込んだデータをバリデーション

 では、実際にバリデーションをしていきたいと思います。

 下記が完成形のソースになります。



use App\Sample;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;
use Illuminate\Support\Facades\Validator;

class SampleController extends Controller
{

  public function showImportCSV()
  {

     return view('sample');

  }

  public function importCSV(Request $request)
  {

     //postで受け取ったcsvファイルデータ
     $file = $request->file('file');

     //Goodby CSVのconfig設定
     $config = new LexerConfig();
     $interpreter = new Interpreter();
     $lexer = new Lexer($config);

     //CharsetをUTF-8に変換
     $config->setToCharset("UTF-8");
     $config->setFromCharset("sjis-win");

     $rows = array();

     $interpreter->addObserver(function(array $row) use (&$rows) {
         $rows[] = $row;
     });

     // CSVデータをパース
     $lexer->parse($file, $interpreter);

     $data = array();

     // CSVのデータを配列化
     foreach ($rows as $key => $value) {

        $arr = array();

        foreach ($value as $k => $v) {

            switch ($k) {

        	case 0:
        	$arr['name'] = $v;
        	break;

        	case 1:
        	$arr['email'] = $v;
        	break;

        	default:
        	break;
            }

        }

        // バリデーション処理
        $validator = Validator::make($arr,[
           'name' => 'required|string|max:255',
           'email' => 'required|string|email|max:255'
        ]);

        if ($validator->fails()) {
           $validator->errors()->add('line', $key);
           return redirect('/sample')->withErrors($validator)->withInput();
        }

        $data[] = $arr;

    }

    // DBに一括保存
    Sample::insert($data);

    return redirect('/sample')->with('save_message', 'CSVのデータを読み込みました');

  }

}

 今回は追記した箇所は、9行目のValidatorのインポート部分と、70〜79行目のバリデーション処理の部分になります。

 バリデーションの内容としては、今回はCSVのデータに「name」と「email」が記載されているという想定なので、この二つに対してバリデーションを行います。そして、もしバリデーションに引っかかった場合は、該当する行番号をエラーオブジェクトに追加(77行目)して、リダイレクトさせる仕様になります。また、見ての通り、今回は1行ごとにバリデーションをしているので、エラーが見つかった段階でリダイレクトする形になります。

まとめ

 ということで、今回はLaravelにおいて読み込んだCSVデータをバリデーションする方法を紹介させていただきました。バリデーションはとても大事な処理なので面倒くさがらずにしっかりやらないとですね。

 それでは、今回はここまで!Hashiでした。また!

この記事のまとめ

  • CSVのデータを読み込んでバリデーションをする方法

お仕事のご相談・ご依頼
お気軽にお問い合わせください!

お仕事の依頼はこちら

著者プロフィール

Taka

東京、奄美大島を拠点にサーフィンとスノーボードが好きなフリーランスのWebクリエイターです。普段はプログラム書いたりデザインしたり映像作ったりしています。いろいろな人の話しを聞くのが好きなので、このブログを通して多くの人と繋がりが出来たら嬉しいです。noteとInstagramもやっているのでフォローしてくれたらありがたいです!

人気記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です