LaravelのEloquentでレコード取得
更新日 : 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コレクションのベースとなっているコレクションを確認してみてください。