「基礎から学ぶLaravel」の感想・備忘録1

スポンサーリンク

点数

95

感想

説明がわかりやすく内容も充実していて、かなりの良書だった。
Laravelの中でもわかりづらい部分である認証・認可・テストについてもしっかりとした解説が書かれていた。
高度な機能は必要なく普通にLaravelを使うだけであれば、本書の内容で十分だと思う。

データベース

親子関係にあるテーブルのシーダー作成

子テーブルのファクトリーで親テーブル::factory()とすることで、シーダーでは子テーブル::factory()を実行するだけでよくなる。

1. sail artisan make:factory AuthorFactory

public function definition(): array
{
  return [
    'name' => fake()->name(),
  ];
}

2. sail artisan make:factory AuthorDetailFactory

public function definition(): array
{
  return [
    'author_id' => Author::factory(),
    'email' => fake()->unique()->safeEmail(),
  ];
}

3. sail artisan make:seeder AuthorTableSeeder

public function run(): void
{
  AuthorDetail::factory(5)->create();
}

中間テーブルの作成

命名規則

author_bookのようにテーブル名の単数系をアルファベット順で並べる。

マイグレーションの作成

sail artisan make:migration create_author_book_table --create=author_book

Schema::create('author_book', function (Blueprint $table) {
  $table->foreignId('author_id')->constrained();
  $table->foreignId('book_id')->constrained();
  $table->timestamps();
  $table->primary(['book_id', 'author_id']);
});

Authorモデル

 function books(): BelongsToMany
{
  return $this->BelongsToMany(Book::class)->withTimestamps();
}

Bookモデル

public function authors(): BelongsToMany
{
  return $this->BelongsToMany(Author::class)->withTimestamps();
}

シーダーの作成

sail artisan make:seeder AuthorBookTableSeeder

public function run(): void
{
  $authors = Author::all();
  foreach (Book::all() as $book) {
    $authorIds = $authors->random(2)->pluck('id')->all();
    $book->authors()->attach($authorIds);
  }
}

モデルのattach, sync, detachメソッドで中間テーブルのデータ登録削除が可能

  • $book->authors()–>attach($authorId); // 登録
  • $book->authors()–>sync([1, 2, 3]); // 紐付けを全て削除してから登録
  • $book->authors()–>detach($authorId); // 削除
  • $book->authors()–>detach(); //bookから全てのauthorを削除

Eager Loading

// N+1問題を解決するには、withメソッドを使用する。
DB::enableQueryLog();
Author::with('detail')->get();
var_dump(DB::getQueryLog());

// 複数テーブルをEager Loadingする場合は引数を配列にする。
Book::with(['authors', 'categories'])->get();

// ネストされたテーブルをEager Loadingする場合はドットでつなぐ。
Book::with('authors.detail')->get();

生のSQL

xxxRawメソッドで自由にSQLを生成することができる。
Book::selectRaw('title, price')->whereRaw('id IN(1,2)')->orderByRaw('price DESC')->get();

Joinの結合条件が複数になる場合

joinメソッド、leftJoinメソッドの第2引数に関数を渡す。

Category::leftJoin('books', function($join) {
  $join->on('categories.id', '=', 'books.category_id')
  ->where('books.price', '>', 3000)
  ->where('books.price', '<', 6000);
})->get();

コメント