質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3025閲覧

Laravelで大容量のcsvをシーディングする場合

bws

総合スコア98

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/01/12 04:01

やりたいこと

10万行、40MBくらいのcsvデータをシーディングで読み込みをしています。

困っていること

読み込みにとても時間がかかってしまいます。
初期データなのでシーディングで管理できた方がいいと思ったのですが、そもそも大容量のデータをシーディングで管理しようというのが間違いでしょうか?
時間は待てるとしてもphp artisan db:seed --class=OrderProductsTableSeeder
した後、進捗なども表示されなので動いてるのか固まっているかもわからないので困っています。
大容量のcsvデータをシーディングする良い方法はありませんか?

特に良い方法がなければcsvファイルを小分けにしてシーディングするしかないとは思っています。
よろしくお願いします。

コード

PHP

1 2use Illuminate\Database\Seeder; 3use Carbon\Carbon; 4 5class OrderProductsTableSeeder extends Seeder 6{ 7 /** 8 * Run the database seeds. 9 * 10 * @return void 11 */ 12 public function run() 13 { 14 $file = new SplFileObject('database/csv/data.csv'); 15 $file->setFlags( 16 \SplFileObject::READ_CSV | 17 \SplFileObject::READ_AHEAD | 18 \SplFileObject::SKIP_EMPTY | 19 \SplFileObject::DROP_NEW_LINE 20 ); 21 22 $is_first = true; 23 $now = Carbon::now(); 24 25 foreach ($file as $line) { 26 27 if ($is_first === true) { 28 $is_first = false; 29 continue; 30 } 31 32 $id = $line[0]; 33 $orer_id = $line[1]; 34 $product_id = $line[2]; 35 $quantity = $line[3]; 36 37 $list = [ 38 'id' => $id, 39 'order_id' => $order_id, 40 'product_id' => $product_id, 41 'quantity' => $quantity, 42 'created_at' => $now, 43 'updated_at' => $now 44 ]; 45 46 DB::table("order_products")->insert($list); 47 } 48 } 49}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

PHPのコードで取り込むのは時間がかかるので、mysqlimport コマンドをSeederから叩くのが速いと思います。

https://dev.mysql.com/doc/refman/5.6/ja/mysqlimport.html

mysqlimport --fields-terminated-by=',' --fields-enclosed-by='"' -h {HOST_NAME} -u {USER_NAME} -p{PASSWORD} -d {DATABASE_NAME} /path/to/{TABLE_NAME}.csv

投稿2019/01/12 04:07

編集2019/01/12 04:07
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bws

2019/01/12 09:09

ありがとうございます!そんな方法があるのですね。試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問