LaravelのEloquentを徹底解説
本章では、LaravelのEloquentについて解説していきます。
Laravelでデータベースアクセスする仕組みをSNSアプリの開発を通じて理解していきましょう!
チュートリアルの全体像
本チュートリアルを通じて学べる内容は以下のようになります。
- Laravelの開発環境セットアップ
- Laravel Breezeで認証機能を導入
- Laravelのルーティングを徹底解説
- Laravelのコントーラーを徹底解説
- Laravelのブレイドを使ってみよう
- マイグレーションの仕組みを解説
- シーディングを使ってみよう
- Eloquentの基本と使い方を徹底解説 (now🐾)
- 画像アップロードを実装する方法
- バリデーションを実装してみよう
- Laravelで認可処理を実装しよう
動画で学びたい方はこちらから!
Eloquentとは
Eloquentは、簡潔にデータベースにアクセスできる仕組みを備えたORM (Object-Relational Mapping) と呼ばれるライブラリです。
前回のマイグレーションの章ではデータベーステーブルの作成を行いましたが、Eloquentを使うと、そのテーブルに対してデータを取得、作成、更新、削除することができます。
Eloquentを使ってデータベースにアクセスするためには、各テーブルに対してモデルクラスを作成する必要があります。
データベースのテーブルをクラスとして扱い、レコードをオブジェクトとして操作することで、SQL文を直接書かずにデータベースとやり取りできます。
本チュートリアルで開発しているアプリの場合は以下のようなモデルクラスが必要になります。
それでは、さっそくモデルクラスを作成してみましょう。
以下のコマンドを実行します。
php artisan make:model Post
php artisan make:model Comment
コマンドを実行すると、app/Modelsの下に以下のファイルが作成されます。
- Post.php
- Comment.php
こちらが実際にデータベースにアクセスする際に使うモデルクラスになります。
※UserクラスはLaravelのインストール時にデフォルトで作成されています。
リレーション
多くの場合、データベースのテーブルは他のテーブルと関連しています。
本チュートリアルで開発しているSNSアプリを例に見ていきましょう。
「ユーザー」と「投稿」の関係
ユーザーは複数の投稿を作成することができ、投稿はひとりのユーザーに関連づいています。
この関係性を「1対多」の関係といいます。
postsテーブルのuser_idとusersテーブルのidが関連しています。
本チュートリアルのテーブルの全体像は以下のようになっています。
「ユーザー」と「投稿」と「コメント」の関係
それでは、モデルを定義していきましょう。
app/Models/User.php
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
'description',
];
// ...省略...
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
}
app/Models/Post.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use HasFactory;
use SoftDeletes;
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function comments(): HasMany
{
return $this->hasMany(Comment::class);
}
}
app/Models/Comment.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class Comment extends Model
{
use HasFactory;
use SoftDeletes;
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function post(): BelongsTo
{
return $this->belongsTo(Post::class);
}
}
マイグレーション実行
php artisan migrate
コントローラーにロジック作成
モデルが定義できたので、コントローラーにDBアクセスロジックを追加していきましょう。
app/Http/Controllers/DashboardController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
public function index(Request $request)
{
$posts = $request->user()->posts()->orderBy('created_at', 'DESC')->get();
return view('dashboard', ['user' => auth()->user(), 'posts' => $posts]);
}
}
app/Http/Controllers/PostController.php
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$posts = Post::orderBy('created_at', 'DESC')->get();
return view('posts.index', ['posts' => $posts]);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('posts.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(Post $post)
{
return view('posts.show', ['post' => $post]);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Post $post)
{
return view('posts.edit', ['post' => $post]);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Post $post)
{
$post->caption = $request->caption;
$post->save();
return redirect(route('dashboard'));
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Post $post)
{
$post->delete();
return redirect(route('dashboard'));
}
}
app/Http/Controllers/UserController.php
<?php
namespace App\Http\Controllers;
use App\Models\User;
class UserController extends Controller
{
public function index()
{
$users = User::orderBy('created_at', 'DESC')->get();
return view('users.index', ['users' => $users]);
}
public function show(User $user)
{
$posts = $user->posts()->orderBy('created_at', 'DESC')->get();
return view('users.show', ['user' => $user, 'posts' => $posts]);
}
}
app/Http/Controllers/CommentController.php
<?php
namespace App\Http\Controllers;
use App\Models\Comment;
use App\Models\Post;
use Illuminate\Http\Request;
class CommentController extends Controller
{
public function store(Request $request, Post $post)
{
$user = $request->user();
$comment = new Comment();
$comment->user_id = $user->id;
$comment->post_id = $post->id;
$comment->text = $request->text;
$comment->save();
return redirect(route('posts.show', $post));
}
}
まとめ
以上、Eloquentについての解説でした!
Eloquentを使ったデータベースアクセスをしっかり学んで慣れると複雑なアプリケーションでもすばやく開発できるようになるので、ぜひマスターしてください!
次回は、画像アップロードについてです。
この記事へのコメントはありません。