サイトアイコン 上尾市のWEBプログラマーによるブログ

「PHPフレームワーク Laravel Webアプリケーション開発」の感想・備忘録7

データベース

マイグレーション

作成

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 migrate:refresh

全テーブル削除&実行

php artisan migrate:fresh

シーダー

作成

php artisan make:seeder BooksTableSeeder
DatabaseSeederのrunメソッドに以下の記述を追加。
$this->call(BooksTableSeeder::class);

実行

php artisan db: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を投げる。

whereXxxメソッド(Xxxはカラム名)

Book::whereName('学問のすゝめ');
戻り値はIlluminate\Database\Eloquent\Collection

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();
モバイルバージョンを終了