LaravelでDBからデータを取得する方法

こんにちは、はるまきです。今回は「自作Webサービス解説シリーズ」です。今回で第4回目!

自作Webサービスのアクアリウム専門の質問サイト→ Q&Aquarium

このシリーズでは、初学者の僕が学んだことや、ハマったポイントなどを紹介しています。間違っている箇所があればご指摘お願いします。※あくまで僕(はるまき)流の解釈をもとに作成しています。

今回は、LaravelでDBからデータを実際に取得する方法の紹介です。

データベースとリンクさせる

まずはLaravelとデーターベースを接続しないといけません。これに関しては別の記事で紹介しております。→Laravelとデータベースをリンクさせて、コントローラーで使ってみる。

もうすでに、LaravelでDBがリンクしていることを前提として、話を進めていきます。

データの取得方法には2つある:クエリビルダとEloquent

Harumaki
Harumaki

ファッ?!クエリビルダとEloquent?!何が違うねん。。

データを取得する方法は、大きく2つあります。クエリビルダとEloquentです。この2つは似て非なるもので、始めは「どっちか1つにしてくれー!ややこしい!」と思ってました。結論としては、Eloquentを使う方がいろんなことができて楽だと思います。それぞれ簡単に紹介します。まずはクエリビルダから。以下。

$users = DB::table('users')
                     ->select(DB::raw('count(*) as user_count, status'))
                     ->where('status', '<>', 1)
                     ->groupBy('status')
                     ->get();

Laravelの公式サイトから拝借しました。クエリビルダのポイントとしては、Modelを作成せずに、DBクラスを使っていることでしょうか。(僕的解釈ですが)。DB::table(")で取得したいテーブルを選択し、その後に、いろんなメソッドを使ってSQL文っぽいものを記述している感じです。各メソッドに引数を入れることで、中でSQL文を生成しているんでしょうね。各メソッドの解説は後ほど行いたいと思います。

Eloquent

お次はEloquent。これもこれで、なんでこんなややこしい名前なのかな〜、なんて思いました。英語で「雄弁な、表現豊かな」などの意味があるようです。こいつの使い方は以下。

use App\Model\Hoge;

$hogeItems = Hoge::select('id','name','age')->get();//①EloquentでDBデータを取得

//②取得したコレクションをforeachで分解
foreach ($hogeItems as $hogeItem) {
    echo $hogeItem->id;
    echo $hogeItem->name;
    echo $hogeItem->age;
}

ポイントはModelクラスを使っていることだと思います。公式サイトでも以下のように言っています。なんかクエリビルダが少し進化したクエリビルダみたいな感じかなと。

各Eloquentモデルは、対応するデータベーステーブルへすらすらとクエリできるようにしてくれるクエリビルダだと考えてください。

また戻り値も変わってきます。

クエリビルダの場合はコレクションの中に連想配列が入っており、ORMの場合はモデルクラスのインスタンスが入っているのがわかる。
てことは、ORMの場合は取得した結果をクラスのインスタンスとして扱うことができるので、DBの構造や連想配列を全く意識しないでゴニョゴニョできて便利。

Harumaki
Harumaki

ふむふむ・・・。要はEloquentを使っておけば良いわけですな。(勝手な解釈)

DBからデータ取得の時によく使うメソッド

 

$hogeItems = Hogetable::where('name','Hoge')->get();//①
$hogeItems = Hogetable::select('id','name')->where('name','Hoge')->get();//②
$hogeItems = Hogetable::where('name','Hoge')->latest()->paginate(10)//③
$questionItems = Question::whereIn('id', [1, 2, 3])->get();//④

こんな感じですかね。

ModelのHogetableクラスのクラスメソッドを使います。そのクラスメソッドが、たくさんあるわけです。公式サイトにたくさん書かれてありますので興味のある人はご覧ください。→公式サイトへ

簡単にですが、上記のメソッドの役割を紹介します。

  • ①:where()では、第一引数にDBのカラムを設定して、取得したいレコードを得る為の値を第二引数に設定します。例では、nameカラムの値が’Hoge’なレコードを指定しているわけですな。そしてチェーンメソッド(連結してメソッドがかけちゃう。純粋なC言語から入った僕は、始め驚きました。笑)を使った、get()で、実際に取得する処理が起こっています。
  • ②:select()は、取得するカラムを指定できます。通常は対象のレコード内の全カラムをごっそり取ってきますが、「処理に必要なカラムだけでOK!」って時にはこれを指定します。基本的には指定するのかな?僕はしてます。
  • ③: latest()は更新が新しい順に取得します。paginate()は引数の数で1ページが構成されるようにレコードを取得します。
  • ④:whereIn()メソッドは複数のor条件を指定できます。例では’id’が1,2,3のレコードを取得しています。

最後に

DBからデータを取得する処理は、基本的なものなので、押さえておきたいですね! 僕も忘れたくない。。。

今回は以上です。

 自作Webサービスのアクアリウム専門の質問サイト  → Q&Aquarium

このシリーズでは、初学者の僕が学んだことや、ハマったポイントなどを紹介しています。間違っている箇所があればご指摘お願いします。※あくまで僕(はるまき)流の解釈をもとに作成しています。

次回もお楽しみに〜。