サイト構築DIY -Laravelでのデータベース操作

Laravelを使い始めて戸惑ったことの一つに、DBの操作の方法があります。 というのは、Modelやら、EloqentORMやら、DBファサードやら、クエリビルダーやら、なじみのない用語が出てきたり、また、同じ処理をするにも複数の方法があったりするためです。 手っ取り早く、コードの書き方を調べて処理の実装はしたものの、どの方法による処理なのか混乱してしまいました。 そこで、自身の整理のためにも、改めて日本語ドキュメントのページに沿って、どこのページにどの方法についての解説があるのかを再確認してみました。 なお、ここでは、Laravelの長期サポート版(LTS)のV6を前提としています。 また、日本語ドキュメントとは、こちらに掲載された翻訳版のことで、以下公式ページとは、このページを指しています。(フッターにLicensed by MIT Licenseとありますので) PHP/Laravel体験講座

Laravelでのデータベースの操作

公式ページの解説には、はっきり書いてないのですが、データベース操作の方法は、以下の2つと考えると分かりやすいと思います。
       (1)DBファサード
       (2)EloquentORM
使い分けとしては、このうち、まずはEloquentによる方法が分かれば、それを優先的に使う方が便利なのでしょうが、独特な書き方が分からない場合は、DBファサードでという順序になるかと思います。 公式ドキュメントでは、必ずしも上記のように区分けした説明の構成ではないのですが、上記に分けて、それぞれの解説箇所を確認しました。 「Laravelのドキュメント」のページから、6.xLTS日本語を開くと、インストールの解説のページが開き、そのページの「設定」という項目の一番下のその他の設定に、小さな文字で「データベース」とあり、そのリンクからデータベースの解説ページに遷移できます。

図:公式ページ「Laravel 6.x インストール」

  上記ページの「データベース」から遷移したページでは、「イントロダクション」の下に、以下のように記載されています。

図:公式ページ「Laravel 6.x データベース:利用開始」

このなかで、(1)SQLを直接使用する場合(2)Fluentクエリビルダ は共に、DBファーサードによる記述方法と思います。 そのため、上記のように、(1)DBファサード、(2)Eloquent ORMの2つに区分したわけです。 「SQLを直接使用する場合」については、この公式ページの「SQクエリの実行」以下から解説されています。 また、上記ページの「Fluentクエリビルダ」のリンクからは、DBファサードのクエリビルダによるデータベース操作に、一方、「Eloquent ORM」のリンクからは、モデル(EloquentのリンクORM)によるデータベース操作についての解説ページに、それぞれ遷移します。 詳しくは上記の各ページに解説がありますが、基本的な記述の例を、公式ページから抜粋して以下に記載しています。

DBファサードによるDB操作

ファサードというのは、インスタンス化せずにいきなり使えるStaticクラスといったものの様で、解説者によっては、DBクラスと書かれていたりします。 基本的な記述の仕方には以下のようになっています。 ただし、詳しくは、こちらの公式サイトを参照して確認してください

1)SQLをそのまま実行

CRUDの基本的なSQLをそのまま記述する場合の書き方です。
(1)DBファサードを使用するための記述 use Illuminate\Support\Facades\DB; (2)SQLの実行文
①SELCTの場合:
    $result=DB::SELECT(’select * from users where id',['id'->1]);
②INSERTの場合:
  DB::('insert into users (id, name) values (?, ?)',[1,'Dayle']);
③UPDATEの場合:
  $affected = DB::update('update users set votes = 100 where name = ?', ['John']); 
④DELETEの場合:
  $deleted = DB::delete('delete from users'); 
⑤その他:
  DB::statement('drop table users');

公式ページから抜粋

  それぞれの戻り値については、上記の公式サイトのページで確認ください。

2)基本的なクエリビルダ

「データベースクエリビルダは、ほとんどのデーターベース操作が可能で、クエリを書くには、DBファサードのTableメソッドを使います」と説明されています。 まずは、DBファサードを使用するための記述をします。 use Illuminate\Support\Facades\DB; そのうえで、DB::('table名')とすると、指定したテーブルに対するクエリビルダインスタンスを返すので、whereなどの条件をつないで、最終的な結果をget()で取得するということです。 例えば、以下のような記述になります。
①1レコード取得の場合
$user = DB::table('users')->find(3);
$user = DB::table('users')->where('name', 'John')->first();

②複数レコードの場合
$users = DB::table('users')->get();

公式ページの「結果の取得」のサンプルより

尚、複数レコードの場合は、値の取得をforeachで処理するなどの違いに留意が必要です。
foreach ($users as $user) {
         echo $user->name;
}

公式ページの「全レコード取得」より

 

3)クエリビルダでSQLを記述する場合

DB::rawメソッドでも、なまのSQLを使用できます。 ただし、SQLインジェクションの脆弱性を生まないように注意が必要ということです。
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))->where('status', '<>', 1)
->groupBy('status')->get();

公式ページの「SQL文」より

クエリビルダーでJOIN文

$users = DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.*', 'contacts.phone', 'orders.price')
            ->get();

公式ページの「JOIN」より

上記は、INNER JOIN ですが、LEFT JOIN/RIGHT JOINも同様に記述できます。 そのほか、副問い合わせを含むなど、もう少し複雑な処理をする場合は、上級JOIN文の解説などを確認ください。

データベーストランザクション

トランザクションについては、DBファサードのtransactionメソッドによる方法、手動トランザクションによる方法の解説が、Fluentクエリビルダのページの下の方にあります。  

EloquentORMによるDB操作

EloquentORM使った書き方の解説は、こちらです。 Eloquentモデルによる処理なので、予めモデルを適切に作成しておく必要があり、解説ページのモデル定義、Eloquentモデル規約に説明があります。  

②Eloquent(モデル)を使った書き方

Eloquentモデルは、クエリビルダとしても動作するということで、基本的な記述は、以下のようになります。
$flights = App\Flight::where('active', 1)
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();

公式ページの「モデルの取得」より

※Flightがモデル

1レコードを取得する便利な使い方

よく使う、便利な書き方があります。
// 主キーで指定したモデル取得
$flight = App\Flight::find(1);

// クエリ条件にマッチした最初のモデル取得
$flight = App\Flight::where('active', 1)->first();

// クエリ条件にマッチした最初のモデル取得の短縮記法
$flight = App\Flight::firstWhere('active', 1);

公式ページの「1モデル/集計の取得」より

InsertやUpdate

Insertは、モデルの新しいインスタンスを作成して、saveメソッドを実行します。
        $flight = new Flight;
        $flight->name = $request->name;
        $flight->save();

公式ページの「Inserts」より

Updateは、saveメソッドを使います。
①1レコード更新の場合
 $flight = App\Flight::find(1);
 $flight->name = 'New Flight Name';
 $flight->save();
②U複数レコードの更新の場合
 App\Flight::where('active', 1)
          ->where('destination', 'San Diego')
          ->update(['delayed' => 1]);

公式ページの「Updates」より抜粋

DELETE
$flight = App\Flight::find(1);
$flight->delete();

公式ページの「モデル削除」より

上記のような、基本的な例の他、様々な機能があるので、Eloquentの解説ページを確認ください。

リレーション

Eloquentのリレーションについて、こちらに解説があります。理解して使いこなせれば便利なのかもしれません。ここではマニュアルの記述ページの案内までとします。具体な使い方は、まだ今後の課題です。

まとめ

非現役エンジニアが自前でWebサイトを構築した際に、困惑したここと、また忘れがちなことなどを自身の整理のためを含めて、再確認しています。 今回は、Laravelのデータベース操作に関する公式サイトの参照先のページについてでした。参考になれば幸いです。

コメント

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