基礎から学ぶ Laravel
posted with ヨメレバ
株式会社クロノス 佐野大樹 シーアンドアール研究所 2023年06月13日
点数
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();