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()で取得するということです。 例えば、以下のような記述になります。尚、複数レコードの場合は、値の取得をforeachで処理するなどの違いに留意が必要です。①1レコード取得の場合 $user = DB::table('users')->find(3); $user = DB::table('users')->where('name', 'John')->first(); ②複数レコードの場合 $users = DB::table('users')->get();公式ページの「結果の取得」のサンプルより
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文
上記は、INNER JOIN ですが、LEFT JOIN/RIGHT JOINも同様に記述できます。 そのほか、副問い合わせを含むなど、もう少し複雑な処理をする場合は、上級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」より
データベーストランザクション
トランザクションについては、DBファサードのtransactionメソッドによる方法、手動トランザクションによる方法の解説が、Fluentクエリビルダのページの下の方にあります。EloquentORMによるDB操作
EloquentORM使った書き方の解説は、こちらです。 Eloquentモデルによる処理なので、予めモデルを適切に作成しておく必要があり、解説ページのモデル定義、Eloquentモデル規約に説明があります。②Eloquent(モデル)を使った書き方
Eloquentモデルは、クエリビルダとしても動作するということで、基本的な記述は、以下のようになります。※Flightがモデル$flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get();
公式ページの「モデルの取得」より
1レコードを取得する便利な使い方
よく使う、便利な書き方があります。// 主キーで指定したモデル取得 $flight = App\Flight::find(1); // クエリ条件にマッチした最初のモデル取得 $flight = App\Flight::where('active', 1)->first(); // クエリ条件にマッチした最初のモデル取得の短縮記法 $flight = App\Flight::firstWhere('active', 1);
公式ページの「1モデル/集計の取得」より
InsertやUpdate
Insertは、モデルの新しいインスタンスを作成して、saveメソッドを実行します。Updateは、saveメソッドを使います。$flight = new Flight; $flight->name = $request->name; $flight->save();
公式ページの「Inserts」より
DELETE①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」より抜粋
上記のような、基本的な例の他、様々な機能があるので、Eloquentの解説ページを確認ください。$flight = App\Flight::find(1); $flight->delete();
公式ページの「モデル削除」より
コメント