2022/06/14
Eloquentモデルはクエリビルダですから、クエリビルダで使用できる全メソッドを確認しておくべきでしょう。
Eloquentクエリでどんなメソッドも使用できます。
SQLに詳しくなくても、データベースにアクセスするためのクエリを生成してくれる機能です。
クエリを記述するには、主にDBファサードのtable()メソッドを使用します。
(※Eloquentモデルでも使用可)
INDEX
- 結果データ取得(複数)
- 結果データ取得(単数)
- 条件
- 条件(queryメソッドを使った書き方)
- 複数条件を扱いたい(A and B)
- 複数条件を扱いたい(A or B)
- 指定した配列の中にカラムの値が含まれているか?
- ページネーションをつける
- 複数条件を扱いたい + 集計関数 + ページネーション
- 内部結合・外部結合
- A and (B or C)
- A and (B or C) + 変数を使いたい
- POST/GET送信で送られたデータを条件にする
- POST/GET送信で送られたデータを条件にする(配列の場合)
- (A or B) and (C or D)
- 順序/グループ
- あいまい検索(部分一致検索)
- オフセット
- 特定のカラムだけを取得
- 3テーブルを結合
- レコードのカウントを取得(count関数)
- SELECT句のみ(where句なし)
- 特定の値以外を抽出
- SQL文を確認(デバッグ作業)
- 検索 keyword(パラメータ)の持ち回り
- リレーション先の情報を元にクエリの生成(whereHas)
- ランダムに取得(random)
- 「以外」を指定する
- クエリビルダを使わない場合(直のSQL文)
1.結果データ取得(複数)
条件指定に沿った結果データの全てを取得
返り値は StdClass オブジェクトのインスタンスを結果として含む Collection オブジェクトとして返ってきます。
Collection は様々な機能を持ったクラスで、厳密にはarrayではありません。
[]添字をサポートしていたり、foreach に入れても動きます。
個々の結果データにアクセスするには、以下のようにループで回します。
2.結果データ取得(単数)
単一レコードのみ抽出。
結果データはStdClassオブジェクトで取得されます。
取り出し方は以下になります。
3.条件
4.条件(queryメソッドを使った書き方)
例えば、集計関数とページネーションの両方を取りたい場合はこっちがおススメ。
5.複数条件を扱いたい(A and B)
query()
メソッドを使った書き方
6.複数条件を扱いたい(A or B)
7.指定した配列の中にカラムの値が含まれているか?
8.ページネーションをつける
Bladeでの表示
クエリービルダーで抽出したレコードは以下のように ページャーとレコードを表示させます。
該当レコードが無い場合
9.複数条件を扱いたい + 集計関数 + ページネーション
集計関数はページネーションより前に置いてください。
ページネーションを先に置くと、2ページ目でカウントが0になります。
10.内部結合・外部結合
例:profilesテーブルとusersテーブルを内部結合・外部結合
usersテーブルのemailカラムとprofilesテーブルのemailカラムが重複する場合
11.A and (B or C)
(B or C)の箇所をクロージャーで書きます。
12.A and (B or C) + 変数を使いたい
変数を使うときは use
を使います。
13.POST/GET送信で送られたデータを条件にする
whenメソッド
の第一引数がfalseの場合、クロージャーを実行しません。
14.POST/GET送信で送られたデータを条件にする(配列の場合)
例:都道府県のチェックボックス
15.(A or B) and (C or D)
16.順序/グループ
17.あいまい検索(部分一致検索)
第3引数を
''
(シングルクォーテーション)で囲むと、変数 $sample
が展開されない。これを
""
(ダブルクォーテーション)で囲ってあげると展開され、検索できる。
18.オフセット
結果レコードの取得開始位置(何件目から取得するか)を指定するには offset()メソッド を使います。
offset()メソッドとセットで利用されるのが limit()メソッド です。
limit()メソッドはデータベースからの取得件数を指定するメソッドです。
offset() & limit() = skip() & take()
19.特定のカラムだけを取得
SQLでいうところの SELECT `tag` FROM contents WHERE id=$id AND category=$category;
value()メソッドで指定した1つのカラムのみを取得します。
get()メソッドの引数にカラム名を入れるやり方も可能。ただ、こちらの場合、引数が配列になることに注意。
20.3テーブルを結合
3つのテーブルを内部結合する場合は Join()
メソッドをそのままチェーンメソッドとして使います。
事例)「users」テーブル + 「user_admins」テーブル +「profiles」テーブル
21.レコードのカウントを取得
DBのレコードのカウントを取得したいケースです。
22.SELECT句のみ(where句なし)
一覧画面で代表的なカラムのみ取得したい場合、SELECT句はどこに書けばいいか?
23.特定の値以外を抽出
24.SQL文を確認(デバッグ作業)
toSql()メソッドで、発行しているSQL文を確認できます。
25.検索 keyword(パラメータ)の持ち回り
ページリンクにて、検索Keywordを持ちまわる必要があるが、それは、$model->appends() を利用する。
26.リレーション先の情報を元にクエリの生成(whereHas)
リレーション先の情報を利用してクエリを発行したい場合は「whereHas」が利用できます。
User.php(モデル)
IndexController.php(コントローラ)
・第二引数では postsテーブル を見た際のクエリです。(※無名関数を使用する)
・無名関数とはクロージャとも呼ばれ、関数名を指定せずに関数を作成できるようにするもの。
・この場合の created_at は posts.created_at を意味する。
27.ランダムに取得(random)
Collectionクラスでは、randomメソッドを使用することでランダムな並び順にすることが出来ます。
28.以外を指定する
自分以外のユーザーの投稿のみを表示させたい場合
29.クエリビルダを使わない場合(直のSQL文)
最初の呼び出しで DB と動作をコールします。
DB の SELECT を使うよと宣言してから PHP 従来の SELECT 文を記載します。
JOIN なども従来通りで使います。
また、何か発見したら、ここに追記しようと思います。
以上です。
PHPフレームワーク Laravel入門 第2版
僕がはじめてLaravelを学習するために参考にしたサイトは、掌田津耶乃(しょうだつやの)さんの libro というサイトです。当時(2016年)、Laravel学習サイトの中でもこのサイトは群を抜いてわかりやすく説明されていたので、とても勉強になったのを覚えています。この本は掌田津耶乃さんが書いた本なので、わかりやすく解説されているだろうと kindle で購入しました。2020年8月の時点でいうと日本国内にて唯一の Laravel の良書と言っても良いかと思います。口コミでもLaravel本のロングセラー定番解説書として認知されています。当サイトではチュートリアル形式でLaravelを解説しているので、初心者の方はこの本とセットで学習されるといいと思います。しかし、かなりわかりやすく解説されているとはいえ、PHP中級者以上のスキルは必要です。PHP自体の知識が乏しい方は 独習PHP 第3版 をあわせて購入することをお勧めします。

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。