Eloquentでデータベースから値を取得する【Laravel】
公開日:
最終更新日:
最近はシステム関連もかじる程度にやってます。中でもLaravelが特にわかりやすくドキュメントも豊富なので初心者でも勉強しやすいと思います。
詳しく解説しているドキュメントはすでに山ほどあるのですが、私が実際に使用して直感的でわかりやすいなと感じたEloquentについて書きたいと思います。
少し前置き
IT業界に入った当初はプログラミングなんて全くわからず一つも理解できませんでした。
WordPressや問い合わせフォーム構築などでPHPでコードを書くことが増えてきて、それとなく理解ができるようになったところで、PHPフレームワークにも手をつけてみようと考えました。
一番最初に仕事でPHPフレームワークとして触り始めたのはCakePHP2.xでしたが、初心者には難しすぎてなんじゃこれな感じでした。
そもそもチュートリアルもろくにせずにいきなりコード修正とかやるからって話なのですが・・・。
その後に小規模なシステム案件があった際に、フレームワークなどの制限も特になかったので流行を調べた結果Laravelにたどり着きました。
小規模といえど設計からのシステム構築は初めてだったので、勉強しつつでも構築を進められたのはLaravelの構築の自由度やドキュメントの豊富さがあればこそだったのではないかと思います。
データベースから値を取得する
素のPHPでもPDOとSQL文を記述することで、データベースを操作することはできるのですが、PDO+SQL文の書き方も必要になるので覚えることが必然的に多くなります。
いまだにPDOもSQLもいまいちわかっていない私ですが、Laravelの標準機能であるEloquentを使えばデータベースの扱いも比較的簡単に行うことができます。
まずはPDOで書いてみる
例えばWordPressで使用しているデータベースから投稿情報のIDが1の情報を取得するにはPDOで書くとこういう感じになります。
本来ならnew PDOでデータベースに接続してからprepareで雛形を作成してbindValueで値を入れてexecuteで実行などのお作法的な手順がありますが、面倒なので色々と省きます。
ちなみにWordPressであれば$wpdbから取得はできますが、接続情報を書かなくていいだけでほぼ変わりません。
<?php
// DBへの接続情報を書いて接続する
$pdo = new PDO($dsn, $dbuser, $pwd, $options);
// DBのwp_postsテーブルからIDが1のデータを取得する
$post = $pdo->query("SELECT * FROM `wp_posts` WHERE `ID` = 1");
var_dump($post);
?>
色々と省いてしまっているので比較のしようがないかもしれませんが、この$pdo->query()の中にあるSQL文を書くこと自体が私みたいな自称エンジニアにはかなり辛いのです。(あとそもそもバッククォートを使う機会がほぼないので苦手意識がすでにあります。)
ちなみに上のコードだとwp_postsのID=1の結果しか取得できないため、カスタムフィールドやタクソノミーを取得しようとなるとさらにJOINしたりといった記述も必要になるのでもはや苦行です。
Eloquentで書いてみる
Eloquentであればモデルと対応するテーブルを作成していれば少しの記述でデータを取得できる上に、PDOでは面倒だったJOINで取得するようなデータもリレーションを定義するだけで取得できてしまいます。
接続情報に関しては.envファイルに記述すると自動で接続してくれるのでややこしいことは必要ありません。
ひとまず、上記のPDOで取得した例のようにWpPostモデルを作成して同様の処理を書いてみます。
Laravelのインストール後はルーティングがすでに設定されていて、HomeControllerも用意されているので手っ取り早く記述を確認できます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\WpPost; // useを追記することでWpPost::〜という形式でモデルを使用できます
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
// return部分をコメントアウトしてコントローラ内に処理を書く
// return view('home');
$post = WpPost::find(1);
dd($post);
}
}
?>
実際にちゃんとしたシステムを組むならモデル側で設定が必要な部分もあるのですが、簡単な確認であればこのように記述するだけでデータベースから情報が取得できてしまいます。
結果をHTMLなどに表示させたい場合はforeach()でviewに落とし込んでいく形になります。
ちなみにLaravel側で記述されているdd()というのは結果をdumpした後にdieで処理を止めるといったヘルパー関数になります。
var_dumpするよりも見やすい形で出力してくれます。
おまけ Eloquentでリレーションを定義する
Laravelはリレーションを定義するのが簡単と書いたので軽く説明しておこうと思います。
といっても難しいことを覚える必要はなく、モデルに記述を追加するだけなので非常に簡単です。
テーブルを作成する
WordPressで構築されるテーブルでは少々複雑になるので、新たにcategoriesテーブルとpostsテーブルを用意して進めます。
カラムの構成としてはこのような感じです。
(migrationの作成や手順を省いていたりするので、ドキュメント通りに進めるとわかりやすいです。)
// Posts
id(auto increment), title(text), body(text), created_at, updated_at
// categories
id(auto increment), name(text), slug(text), post_id(integer), created_at, updated_at
ポイントとしてはcategoriesテーブルにpost_idを設定するところです。
このように設定しておくことでリレーション設定時に自動でこのカラム名をキーとしての関連しているIDを結合してくれます。
モデルにリレーションを設定する
テーブルが用意できればあとはモデル側に設定するだけです。
難しいことは考えずにドキュメントにある通りに設定して見ましょう。
// PostModel
public function category(){
return $this->hasOne('App\Category');
}
たったこれだけです。簡単すぎますね。
実際にコントローラーで取得したい場合はこんな感じです。
先ほど使用したHomeControllerに書いてみます。
public function index()
{
// return view('home');
$post_category = Post::find(1)->category;
dd($post_category);
}
postのidが1で紐づいているcategoryオブジェクトを取得できます。
内包されているプロパティを参照したい場合は$post_category->nameなどとすればプロパティも参照できます。
本来は複数のカテゴリーに所属していたり、タグがつけれたりといった機能も必要になると思いますが
多対多のリレーションを設定することもできるので、非常に柔軟な構成が可能です。
まとめ
ざっと説明した感じなので、実際には手順も含めてややこしい部分などはあると思いますが、ドキュメントをたどればわかる内容なので
「PHPフレームワークを覚えてみたい」「システム構築を勉強してみたい」と考えている方は覚える価値は十分にあると思います。
私もまだ覚え始め程度なので、ガッチリとしたシステムを組むにはまだ程遠いですが、今後もLaravelを推していきたいと思っています。
CakePHP2系の保守はもうやめたい・・・。(PHP7対応めんどくさい)