LaravelでCSVファイルを使って簡単にシーダーを実現する方法

Laravel

はじめに

「LaravelでCSVファイルを使ってデータ投入することができないものか」

「Laravelでもっと簡単にシーダーを実行する方法はないか」

こんな疑問を持った方に、今日はLaravelでのCSVファイルを使ったシーダー方法をご紹介します。

シーダーのスクリプトを一つずつ自分で書いていくのは結構手間がかかり、面倒です。

そこで「flynsarmy/csv-seeder」というパッケージを使うことで、CSVファイルを使って簡単にシーダーを実現することが可能です。

本記事では、こちらのライブラリの使い方をサンプルコード付きで解説していきます。

それでは早速見ていきましょう。

✔️ 筆者の経験
・プログラミング歴3年の現役Webエンジニア
・複数の自社サービスの立ち上げを経験

csv-seederの基本的な使い方

まずは公式ドキュメントをご紹介しましょう。

GitHub - Flynsarmy/laravel-csv-seeder: Seed your database with CSV files
Seed your database with CSV files. Contribute to Flynsarmy/laravel-csv-seeder development by creating an account on GitH...

基本的には、こちらの公式ドキュメント通りに進めていただければ実行できますが、このブログでもわかりやすく説明していきます。

インストール

PHPのバージョンによって、インストールするパッケージのバージョンが異なります。

PHPバージョン7.4以上の方は以下でインストールしてください。

"flynsarmy/csv-seeder": "2.0.*"

PHPバージョン7.4未満の方はこちら。

"flynsarmy/csv-seeder": "1.*"

基本的な使い方

シーダーファイルを作成したら、「Flynsarmy\CsvSeeder\CsvSeeder」クラスを継承させます。
また、__constructで、テーブル名とCSVファイルが置いてあるパスを指定する必要があります。

use Flynsarmy\CsvSeeder\CsvSeeder;

class StopsTableSeeder extends CsvSeeder {

	public function __construct()
	{
		$this->table = 'your_table';
		$this->filename = base_path().'/database/seeds/csvs/your_csv.csv';
	}

	public function run()
	{
		// Recommended when importing larger CSVs
		DB::disableQueryLog();

		// Uncomment the below to wipe the table clean before populating
		DB::table($this->table)->truncate();

		parent::run();
	}
}

シーダー実行メソッドである、run()メソッドの最後に「parent::run();」を呼び出す必要があります。
たったこれだけで、CSVファイルでのシーダー実行が実現できます。
素晴らしい!

最後に、CSVファイルを作成していきましょう。

id,name
1,Foo
2,Bar

ファイルは、上記のコード例ですと、「/database/seeds/csvs」ディレクトリ配下に置いておきます。

動作確認

それでは、最後にシーダーを実行して、動作確認してみましょう。

通常のシーダーと同じように、DatabaseSeeder.phpで目的のシーダーファイルを呼び出します。

$this->call(StopsTableSeeder::class);

シーダーを実行します。

php artisan db:seed

phpMyAdminなどでデータベースを確認して、目的のデータが入っていれば成功です🎉

最後に

いかがでしたでしょうか?

非常に簡単にシーダーを実行できることを実感できたのではないかと思います。

Laravelではこのようにパッケージを使うことで、目的の機能を簡単に実現できてしまうことがあります。

何か機能を実装したい場合は、まずはできる限りコードを自分で書かずに実現できないかを調査することをおすすめします。

それでは、今回はこの辺で😆

コメント

タイトルとURLをコピーしました