大量データが必要になるときわざわざ考えてSQL文を書かなくてもいいようにLaravelのSeederを使ってみましょう。
- 前提条件
- Seederとは
- 早速使ってみる
- for文で好きな数を入れてみる
- 最後に
前提条件
Laravel5.7をインストール&設定済み
PHPをある程度理解している
Modelを作成済み
Seederとは
Seeder(シーダー)と読みます!
Laravelに最初から用意されているライブラリ。
マイグレーションと同様DBを管理する機能の一つ。
SQL文を書かなくても簡単にDBに自由なテストデータを導入することができる。
早速使ってみる
Products
という商品テーブルで試してみます。
ターミナルでLaravelをインストールしているディレクトリに移動して以下のコマンドを入力します。
php artisan make:seeder ProductsTableSeeder
そうするとdatabase/seeds/
の中に自動生成されます。
その中に
DatabaseSeeder.php
というものがデフォルトで用意されていますが、
これは作成したシーダーファイルを登録するものになります。
for文で好きな数を入れてみる
<?php
use Illuminate\Database\Seeder;
use App\Product;
class ProdcutsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
for ($i = 1; $i < 6; $i++)
{
Category::create([
//商品の名前
'product_name' => '商品'. $i,
//商品の説明
'product_description' => '商品'. $i .'の説明',
]);
}
}
}
それじゃ簡単に解説。
use Illuminate\Database\Seeder;
use App\Product;
自動生成された時はuse Illuminate\Database\Seeder;
だけが定義されています。
そこにモデルのApp/Product.php
を定義しています。
public function run()
{
}
シーディング処理にはrun
メソッド一つだけが用意されています。
このメソッドの中にレコードを作成するための処理を書いていけばいいということですな。。
for ($i = 1; $i < 6; $i++)
{
Category::create([
//商品の名前
'product_name' => '商品'. $i,
//商品の説明
'product_description' => '商品'. $i .'の説明',
]);
}
レコードが5件欲しかったのと、1からカウントしたかったので、for文はこのような形になってます。
こうすることで1~5の数字が商品一つ一つに振られますね。
Category::create
の配列の中身がカラム名ですね。
その中に商品名と商品説明のデータを挿入しています。
※ちなみにオートインクリメントは既述しなくても自動で付与されます。
さて先ほど少し触れたdatabase/seeds/DatebaseSeeder.php
を開いて
シーダーファイルにProductsTableSeeder
を呼び出す処理を書いていきましょう。
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
//デフォルトではUsersテーブルがコメントアウトされている。
// $this->call(UsersTableSeeder::class);
//Usersテーブルを使用するなら上記をコメントインして追記しても良い
$this->call(ProductTableSeeder::class);
}
}
これで準備ができたので、ターミナルを開いて以下を記述
(ProductClassだけを実行)
php artisan db:seed --class=ProductsTableSeeder
あれ?エラーが出た。
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list'
どうやらTimestamp
がデフォルトでONになっているようです。
Modelを開いて以下を追記しましょう。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
//TimestampをOFFにする
public $timestamps = false;
protected $fillable = [
'id',
'product_name',
'product_description',
];
}
これで再度実行!!
Database seeding completed successfully.
成功です。
最後に
CakePHPとSymfony使ってましたが、比べ物にならないくらいLaravel便利で分かりやすいです。
本当にク○Symonyがベースなのかと疑ってしまう