カテゴリー: BackEnd

LaravelでのDB操作の基礎

はじめに

今回の記事では、PHPのフレームワークであるLaravelでのDB操作に関する基礎知識を紹介します。Laravelの基礎知識に関してはこちらをご覧ください。

Eloquent

EloquentはLaravelの標準のORMです。DB上のデータの検索、作成、更新はもちろん、リレーション、論理削除なども簡単に扱うことができます。

それでは、実際にEloquentの使い方を見ていきましょう。

モデルの定義

モデルは artisan make:model コマンドで作成することができます。Bookモデルの作成は以下のようになります。

$ php artisan make:model Book

上記のコマンドを実行すると、 app ディレクトリの直下に Book.php が作成されます。

また、まだマイグレーションファイルを作成していなければ、モデルの作成時にマイグレーションファイルを一緒に作成することができます。マイグレーションに関しては次に説明します。

$ php artisan make:model Book -m

通常、モデルは app 直下に作成されますが、オートロードするように指定してある場所ならどこに作成してもよいです。例えば、 app/Models 直下に作成したい場合は以下のようにします。

$ php artisan make:model 'App\Models'

モデルの取得

DBからレコードを1件取得するには find メソッドを使用します。以下のように使用します。

// idが1のレコードを取得する
$book = App\Book::find(1);

複数のレコードを取得するには all メソッドを使用します。以下のように使用します。

$books = App\Book::all();

whereなど、条件をつけてレコードを取得したい場合は where メソッドを使用します。以下のように使用します。

// IDが10より大きいレコードをすべて取得する
$boosk = App\Book::where('id', '>', 10)->get();

whereRaw メソッドを使用すると任意のSQLを実行することができます。以下のように使用します。

// IDが10より大きいレコードをすべて取得する
$boosk = App\Book::whereRaw('id > ?', [10])->get();

モデルの追加

レコードを1件追加するには2種類の方法があります。1つ目はインスタンスを生成してから save メソッドを使用する方法です。以下のように使用します。

$book = new App\Book();
$book->save();

2つ目は create メソッドを使用する方法です。この方法では事前にモデルに fillable プロパティで変更を許可するパラメータを列挙しておく必要があります。以下のように指定します。

<php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    protected $fillable = ['title', 'price'];
}

以下のように使用します。

$book = App\Book::create(['title' => 'hoge', 'price' => 100]);

複数のレコードを一度に追加するには insert メソッドを使用します。注意点としては、insert では先程説明した fillable がきかないので、意図しない値が入る場合があります。以下のように使用します。

App\Book::insert([['title' => 'hoge', 'price' => 100], ['title' => 'fuga', price => 120]]);

モデルの更新

レコードの更新には2種類の方法があります。1つ目はインスタンスを取得してから save メソッドを使用する方法です。以下のように使用します。

$book = App\Book::find(1);
$book->title = 'hogehoge';
$book->save();

2つ目は update メソッドを使用する方法です。この方法では create メソッドと同様に fillable プロパティで変更を許可するパラメータを列挙しておく必要があります。以下のように使用します。

$book = App\Book::where('id', '=', 1)->update(['title' => 'hogehoge']);

モデルの削除

レコードの削除には destroy メソッドを使用します。以下のように使用します。

// IDが1と2のレコードを削除する
App\Book::destroy([1,2]);

クエリスコープ

クエリスコープを定義することで、検索条件を使い回す事ができます。以下のように定義します。

<php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    public function scopeExpensive($query)
    {
        return $query->where('price', '>' 9999);
    }

    public function scopeTitleLike($query, $title)
    {
        return $query->whereRaw('title like ?', ['%'.$title.'%']);
    }
}

以下のように使用します。

$expensiveBooks = App\Book::expensive()->get();
$anyHogeBooks = App\Book::titleLike('hoge')->get();

マイグレーション

マイグレーションファイルを作成し、実行することでデータベースを定義します。

それでは、実際にbooksテーブルを定義してみましょう。

マイグレーションファイルの作成

マイグレーションファイルの作成は artisan make:migration コマンドで行います。

$ php artisan make:migration create_books_table

上記のコードを実行すると database/migrations ディレクトリの直下に CreateBooksTable.php が作成されます。

作成直後のマイグレーションファイルは、カラムが1つも定義されていないので、 title カラムと price カラムを追加します。以下のようになります。

<?php

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

class CreateBooksTable extends Migration
{
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title', 255);
            $table->unsignedSmallInteger('price')->default(100);
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('books');
    }
}

up メソッドには追加したい定義を記述します。逆に down メソッドには元に戻すための処理を記述します。

マイグレーションの実行

マイグレーションは artisan migrate コマンドで行います。以下のようになります。

$ php artisan migrate

上記のコマンドを実行すると、まだ実行されていないすべてのマイグレーションファイルの up メソッドが実行されます。

ロールバック

追加したマイグレーションの定義を戻したい場合には artisan migrate:rollback コマンドを実行します。以下のようになります。

$ php artisan migrate:rollback

上記のコマンドを実行すると、直前に実行したマイグレーションファイルの down メソッドが実行されます。

初期状態に戻す

これまでに実行したマイグレーションをすべてもとに戻したい場合は artisan migrate:reset コマンドを実行します。以下のようになります。

$ php artisan migrate:rollback

さいごに

LaravelでのDB操作の基礎として、Eloquentの使い方とマイグレーションのやりかたを紹介しました。

おすすめ書籍

   

Hiroki Ono

シェア
執筆者:
Hiroki Ono
タグ: phplaravel

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

3週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前