第3回 モデルとデータベースの操作

Laravel WebAPI開発

こんにちは、PHP開発者の皆さん!この連載の第3回では、Laravel 10のモデルとデータベースの操作について詳しく解説します。Eloquent ORMを使用して、データベースとのやり取りを簡単かつ効率的に行う方法を学びましょう。それでは、始めましょう!

1. Eloquent ORMの基本

LaravelのEloquent ORMは、モデルを通じてデータベースとのやり取りを行うための強力なツールです。各データベーステーブルに対応するモデルを定義し、モデルを通じてデータの取得や操作を行います。

モデルの生成

まずは、モデルを生成してみましょう。ターミナルで以下のコマンドを実行します。

./vendor/bin/sail artisan make:model Post
Bash

このコマンドにより、app/Models/Post.php ファイルが生成されます。

2. マイグレーションの作成

マイグレーションは、データベーススキーマを管理するための仕組みです。テーブルの作成や変更をコードで記述し、バージョン管理することができます。

マイグレーションの生成

モデルと同時にマイグレーションを生成するには、以下のコマンドを実行します。

./vendor/bin/sail artisan make:model Post -m
Bash

このコマンドにより、database/migrations/xxxx_xx_xx_create_posts_table.php ファイルが生成されます。

マイグレーションの編集

生成されたマイグレーションファイルを編集して、posts テーブルのスキーマを定義します。

database/migrations/xxxx_xx_xx_create_posts_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}
PHP

マイグレーションの実行

以下のコマンドを実行してマイグレーションを実行し、データベースにposts テーブルを作成します。

./vendor/bin/sail artisan migrate
Bash

3. モデルの定義

Eloquentモデルは、テーブルと対応するクラスです。モデルクラスを定義し、属性やリレーションシップを設定します。

モデルクラスの編集

app/Models/Post.php を開き、以下のように編集します。

app/Models/Post.php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'title',
        'body',
    ];
}
PHP

$fillable プロパティは、マスアサインメント可能な属性を指定します。これにより、複数の属性を一度に設定できます。

4. データベース操作

Eloquentを使ってデータベース操作を行う方法を見てみましょう。

レコードの作成

新しいレコードを作成するには、以下のようにします。

use App\Models\Post;

$post = new Post;
$post->title = 'My First Post';
$post->body = 'This is the body of my first post.';
$post->save();
PHP

または、create メソッドを使って一度に作成することもできます。

Post::create([
    'title' => 'My Second Post',
    'body' => 'This is the body of my second post.',
]);
PHP

レコードの取得

すべてのレコードを取得するには、all メソッドを使います。

$posts = Post::all();
PHP

特定のレコードを取得するには、find メソッドを使います。

$post = Post::find(1);
PHP

レコードの更新

既存のレコードを更新するには、以下のようにします。

$post = Post::find(1);
$post->title = 'Updated Title';
$post->save();
PHP

または、update メソッドを使って一度に更新することもできます。

Post::where('id', 1)->update(['title' => 'Updated Title']);
PHP

レコードの削除

レコードを削除するには、以下のようにします。

$post = Post::find(1);
$post->delete();
PHP

または、destroy メソッドを使って一度に削除することもできます。

Post::destroy(1);
PHP

5. リレーションシップの定義

Eloquentでは、テーブル間のリレーションシップを簡単に定義できます。ここでは、1対多のリレーションシップを例に見てみましょう。

ユーザーモデルの作成

まず、ユーザーとポストの関係を定義するためにユーザーモデルを作成します。

./vendor/bin/sail artisan make:model User -m
Bash

次に、users テーブルのマイグレーションを編集します。

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}
PHP

同様に、posts テーブルに user_id カラムを追加します。

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddUserIdToPostsTable extends Migration
{
    public function up()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
        });
    }

    public function down()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->dropColumn('user_id');
        });
    }
}
PHP

リレーションシップの定義

ユーザーモデルとポストモデルにリレーションシップを定義します。

app/Models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasFactory;

    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
PHP
app/Models/Post.php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
PHP

これで、ユーザーとポストのリレーションシップが定義されました。

6. まとめ

この記事では、Laravel 10のモデルとデータベース操作について解説しました。Eloquent ORMを使うことで、データベースとのやり取りが非常に簡単になります。次回は、RESTful APIの設計と実装について学びます。それでは、次の記事でお会いしましょう!

次の記事: 第4回 RESTful APIの設計と実装

コメント

タイトルとURLをコピーしました