このページの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: | ||
</ | </ | ||
===== app\Http\Controllers\SampleController.php ===== | ===== app\Http\Controllers\SampleController.php ===== | ||
- | 以下、記事まとめ途中 | + | ajax の場合の例。\\ |
+ | 普通の POST 送信の場合は「return response()-> | ||
< | < | ||
+ | <?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-> | ||
+ | $csv_data = $sample_csv-> | ||
+ | |||
+ | $csv_errors = []; // エラーメッセージを格納 | ||
+ | $number_count = []; // number の重複チェック用 | ||
+ | |||
+ | foreach ($csv_data as $key => $val) { | ||
+ | $validator = Validator:: | ||
+ | $val, | ||
+ | $sample_csv-> | ||
+ | $sample_csv-> | ||
+ | $sample_csv-> | ||
+ | ); | ||
+ | |||
+ | if ($validator-> | ||
+ | $csv_errors[$key] = $validator-> | ||
+ | } | ||
+ | |||
+ | $number = $val[' | ||
+ | |||
+ | $number_count[$number] = isset($number_count[$number]) | ||
+ | ? $number_count[$number] + 1 | ||
+ | : 1; | ||
+ | |||
+ | $sample = Sample:: | ||
+ | -> | ||
+ | |||
+ | 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[' | ||
+ | $response[' | ||
+ | return response()-> | ||
+ | } | ||
+ | |||
+ | try { | ||
+ | DB:: | ||
+ | |||
+ | Sample:: | ||
+ | |||
+ | foreach ($csv_data as $val) { | ||
+ | $sample = new Sample(); | ||
+ | $sample-> | ||
+ | $sample-> | ||
+ | } | ||
+ | |||
+ | } catch (\Exception $e) { | ||
+ | $log_message = var_export([ | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ], true); | ||
+ | \Log:: | ||
+ | |||
+ | return response()-> | ||
+ | } | ||
+ | |||
+ | DB:: | ||
+ | |||
+ | return response()-> | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ===== app\Http\Requests\SampleRequest.php ===== | ||
+ | < | ||
+ | <?php | ||
+ | |||
+ | namespace App\Http\Requests; | ||
+ | |||
+ | use Illuminate\Foundation\Http\FormRequest; | ||
+ | |||
+ | class SampleRequest extends FormRequest | ||
+ | { | ||
+ | public function authorize() | ||
+ | { | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | public function rules() | ||
+ | { | ||
+ | return [ | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ], | ||
+ | ]; | ||
+ | } | ||
+ | |||
+ | public function attributes() | ||
+ | { | ||
+ | return [ | ||
+ | ' | ||
+ | ]; | ||
+ | } | ||
+ | } | ||
</ | </ | ||