データベース
マイグレーション
作成
php artisan make:migration create_book_table
ファイル名を「create_テーブル名_table」とするとSchema::create()
が挿入される。
$table->timestamps();
でcreated_at, updated_atカラムが生成される。
create, saveなどEloquentのメソッドを使ってデータを保存した場合はcreated_at, updated_atが更新されるが、insertなどクエリビルダのメソッドを使った場合は更新されないので注意。
実行
php artisan migtate
–seedでシーダーも実行。
巻き戻し
- 直前のみ:php artisan rollback
- 全て:php artisan reset
全て巻き戻し&実行
php artisan migrate:refresh
全テーブル削除&実行
php artisan migrate:fresh
シーダー
作成
php artisan make:seeder BooksTableSeeder
DatabaseSeederのrunメソッドに以下の記述を追加。$this->call(BooksTableSeeder::class);
実行
php artisan db:seed
- シーダー編集後はキャッシュクリアのためにcomposer dump-autoloadが必要。
- マイグレーションに–seedをつけるとシーダーも実行される。
Fakerによるランダムデータの作成
$faker = \Faker\Factory::create('ja_JP');
// $faker->name
// $faker->company
Fakerの日本語化
config/app.phpに'faker_locale' => 'ja_JP',
を追記。
※ wordなど日本語にならないものもある
Factoryによるランダムデータの一括作成
php artisan make:factory BookFactory
$factory->define(\App\Book::class, function (Faker $faker) {
return ['name' => $faker->name];
});
BooksTableSeederに以下の記述を追加。factory(\App\Book::class,10)->create();
シーダーを実行するとBookFactoryを使ったデータが10件登録される。
Eloquent
Mass Assignment
Eloquentの静的メソッドcreateやインスタンスメソッドupdateに連想配列を渡すことでデータを登録することができる機能。
便利な機能だが、変更を想定していないカラムが更新されてしまう可能性がある。
そのため、Eloquentではデフォルトで全てのカラムがMass Assignment無効になっている。
(クエリビルダのinsertやupdateメソッドの場合は登録できる)
Mass Assignmentを使う場合は、$fillable配列を定義する。
全件取得
Book::all();
戻り値はIlluminate\Database\Eloquent\Collection
1件取得
Book::find(2);
戻り値はIlluminate\Database\Eloquent\Model
Book::findOrFail(100);
存在しない場合にIlluminate\Database\Eloquent\ModelNotFoundExceptionを投げる。
- findやfindOrFailはIlluminate\Database\Eloquent\Modelのメソッドではなく\Illuminate\Database\Eloquent\Builderのメソッドである。
- Illuminate\Database\Eloquent\ModelはマジックメソッドでBuilderインスタンスを生成して同じ名前のメソッドをコールしている。
whereXxxメソッド(Xxxはカラム名)
Book::whereName('学問のすゝめ');
戻り値はIlluminate\Database\Eloquent\Collection
- メソッドの実装はIlluminate/Database/Query/Builder.phpにある。
- Eloquent\Modelのマジックメソッド⇒Eloquent\Builderのマジックメソッド⇒Query/Builderのマジックメソッド、とコールされる。
JSON出力
Book::find(2)->toJson();
登録
Book::create(['name' => '死に至る病']); // $fillableの定義が必要
$book = new Book();
$book->name = '死に至る病';
$book->save();
更新
Book::find(3)->update(['name' => '峠']); // $fillableの定義が必要
$book = Book::find(3);
$book->name = '峠';
$book->save();
削除
Book::destroy(4, 5);
$book = Book::find(6);
$book->delete();
アクセサとミューテータ
データの取得や登録時に特定のカラムをフォーマットすることができる、フィルタのようなもの。
アクセサ
getXxxAttributeメソッドを定義する。
public function getNameAttribute(string $value): string
{
return $value . '!!';
}
ミューテータ
setXxxAttributeメソッドを定義する。
public function setNameAttribute(string $value): void
{
// attributesプロパティに加工済みの値をセットする。
$this->attributes['name'] = '##' . $value;
}
firstOrCreateとfirstOrNew
「データがない場合は新規登録」を簡単に記述することができる。
$book = Book::firstOrCreate(['name' => '飛ぶが如く']); // $fillableの定義が必要
$book = Book::firstOrNew(['name' => '飛ぶが如く']); // $fillableの定義が必要
$book->save();
論理削除
論理削除を有効にするには、deleted_atカラムを作成し、モデルにuse SoftDeletes;
を記述する必要がある。
これだけで、deleteメソッドやdestroyメソッド実行時はdeleted_atに日時が保存され、データ取得時は論理削除済みデータは除外される。
マイグレーションに$table->softDeleted();
を追加するとdeleted_atカラムが生成される。
リレーション
1対1
hasOneメソッドとbelongsToメソッドを定義する。
id列がある方にhasOne、xxx_idで参照している方にbelongsToを定義する。
1対多
hasManyメソッドとbelongsToメソッドを定義する。
SQLの確認
toSqlメソッドでプリペアドステートメントのSQLを確認することができる。
実際に実行されたSQLは\DB::getQueryLog();
で確認することができる。
\DB::enableQueryLog();
// SQL実行
// SQL実行
// SQL実行
var_dump(\DB::getQueryLog());
\DB::disableQueryLog();