Eloquentモデルの作成と設定ができたところで、Eloquentモデルを利用してレコードの取得を行っていきましょう。

LaravelのEloquentでレコード取得

3年以内に更新されました。情報が古い可能性があります。
更新日 : 2020年02月05日

Eloquentモデルの作成と設定ができたところで、Eloquentモデルを利用してレコードの取得を行っていきましょう。

事前準備

レコード取得を行うにしても、レコードがないと取得ができないので、前回の記事で作成したPostモデルに対応するpostsテーブルにいくつかレコードを追加しておきましょう。titleカラムとcontentカラムはどんなデータでも構いません。
レコード追加はLaravelのデータベース接続確認で行ったphp artisan tinkerを使っても構いません。

また、今回はEloquentモデルのデフォルト設定で動作するため、Post.phpのモデルは以下のようなコードになっています。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
}

Eloquentモデルを継承しているため、Postクラスの中身には特に必要ありません。必要な機能がEloquentモデルに実装されています。

レコード取得

実際にレコード取得をしてみます。せっかくなのでコントローラーから取得できることを確認しましょう。

今回はLaravelでHelloWorldの記事で作成したHelloControllerでモデルのレコード取得を行っていきます。

コントローラー内に以下のようにコードを追加します。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
// Postモデルを使う準備をしておく
use App\Models\Post;

class HelloController extends Controller {

    public function index() {
        // postsテーブルのすべてのデータを取得し、$postsに代入
        $posts = Post::all();
        // dump関数でデータの確認
        dump($posts);
        // その他は今までどおり
        $data = array('title' => 'Hello World!!');
        return view('hello', $data);
    }
}

データベースからのレコード取得部分以外はそのままです。dump関数はLaravelで用意された変数の中身を確認するためのデバッグ・テスト用ヘルパ関数です。

ちなみにdump関数を利用すると、関数実行後も以降のすべての処理を行い、データの中身を表示してくれます。もう一つ変数の中身を確認するための関数としてdd関数があります。こちらは関数実行後に以降のすべての処理を停止して、変数の中身の表示のみを行います。

コントローラーに記述後、アクセスしてみましょう。

上部に黒く表示されていれば成功です。Eloquentモデルから取得されたデータが表示されています。

三角の矢印部分をクリックすると、さらに内部のデータも確認することができます。#originalの中にある配列を開くと、データベースのレコードが確認できます。これでレコードが取得できているのが確認できます。

レコードの取得結果について

Eloquentでレコードを取得すると、画像のようにCollectionと書かれているかと思います。

これはLaravelフレームワークで利用されるオブジェクトの一つで、Eloquentでレコードを取得した際に、結果が複数ある想定で取得されるときに返却されるインスタンスです。

Collectionオブジェクトは配列を拡張したようなもので、今まで利用してきた配列に近い形式で利用できます。

例えば、上記のコードを少し変えて、dump関数の引数に以下のように設定してみましょう。

dump($posts[0]);

このように配列形式で1つのデータだけを取得することができます。foreach文も利用可能です。

カラムのデータを取得する場合

$posts[0]にはレコード1行分のデータが入っています。ではこのレコード1行のデータの中でカラムにあるtitleを取得する場合にはどのようにするでしょうか。

答えは$posts[0]->titleとなります。

これで、$postsに存在する複数レコードの0番目のレコードデータを取得し、そのレコードデータのtitleカラムに入っているデータを取得できます。

$posts[0]->titleのように、Laravelで取得されたデータベースのレコードは、オブジェクトのメンバー変数として利用できます。

その他のレコード取得

今回はEloquentモデルを利用してall()メソッドを利用しました。

この静的メソッドはテーブル内のレコードをすべて取得する場合に利用できます。

その他のレコード取得の基本については、この記事にて随時追記していきますが、ドキュメントを確認しながら自分で取得したいデータを取得できるようになっていくのが理想です。

条件の追加

allメソッド以外の条件を指定した取得方法をいくつか紹介します。

WHERE条件で取得

SQL文のSELECT文などで利用されるWHERE句もメソッドから実行が可能です。

$post = Post::where('id', 1)->get();

このように記述すると$postの変数にはidカラムが1のレコードを検索します。

条件を付け加えた場合には->get()->first()などで実際にレコードを取得します。条件に当てはまるレコードをすべて取得する場合にはgetメソッドを実行し、条件に当てはまる最初の1行を取得する場合にはfirstメソッドを実行します。

whereメソッドは引数2つの場合には等しい場合の検索を行います。その他にidカラムが3以上のレコードを取得したい場合には以下のようにwhereメソッドを利用します。

$posts = Post::where('id', '>=', 3)->get();

このようにすることで$posts変数にはidが3以上のレコードをすべて取得できます。この場合は$posts変数にはCollectionオブジェクトが格納されています。

もちろん第二引数に曖昧検索のLIKE句を入れても問題なく動作します。

その他のWHEREでの条件指定に関してはこちらのドキュメントのWHERE節を読みながら実装すれば理解できると思います。

まとめ

作成したEloquentモデルを利用してデータベースのレコードを取得しました。

Eloquentモデルやクエリビルダを利用すれば様々な条件でデータを取得することができます。

様々な条件で取得したい場合にはクエリビルダのドキュメントと、Eloquentモデルのドキュメントを確認してみましょう。

また、コレクション(Collection)についてもEloquentのコレクションやEloquentコレクションのベースとなっているコレクションを確認してみてください。