こんにちは!エンジニアのオータケです!
みなさんはモデルでデータを取得する際に複雑な形で取得したい場合がありますよね?
例えば、ブログのようなWebアプリケーションを作る際に特定の投稿者が書いた記事一覧を取得したい場合はどのようにすればよいでしょうか?
そこで今回は
[基礎] 1対多の関係のデータを取得するにはどうするべきか?
[実践] 条件を付けたり並び替えて情報を取得しよう
について解説していきます。
ぜひご覧ください!
リレーションとは?
IT用語辞典には次のような記載があります。
リレーションとは、関係モデルにおいて、データを関連付けている属性の集合のことである。 関係データベースの考案者であるエドガー・コッド(Codd)によって提唱された「コッドの12の法則」(Codd’s 12 Rules)に登場する概念で、今日の関係データベースに多大な影響を与えている基礎的概念のひとつとなっている。
ちょっとよくわからないですよね?
簡単に言えば同じような関係性のモデル(テーブル)とモデル(テーブル)を連携して扱うことだと理解していただけるとわかりやすいのではないかと思います。
例えば、冒頭のブログの件を画像で表すと次のような形になります。
投稿者に対して記事が複数結びつく関係、つまりこれを「1対多」の関係といいます。
この記事では、投稿者のデータを引っ張ってくると記事A,B,Cも一緒に引っ張ってくることができます。
次の章ではこの1対多でデータを取る方法を書いていきます!
1対多のHasManyを使ってみよう
ではまず、コードを見てみましょう。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Writer extends Model { public function posts() { return $this->hasMany('App\Post'); } }
これはモデルのコードになります。
コントローラでpostsメソッドを呼び出すことで投稿者のデータだけでなく記事データも同時に取得することができます。
では実際に使う方法を見てみましょう。
function hoge() { $posts = Writer::find(1)->posts(); }
このようにpostsを呼び出すことでforeachなどといった命令と組み合わせて使うことができます。
HasManyを使って条件(where)で取得データを絞ろう
次にwhereメソッドを使って取得してくるデータに条件を付加して条件に該当するデータだけ引っ張ってくるようにしましょう。
function hoge() { $posts = Writer::find(1) ->posts() ->where('title', 'like', '%Laravel%') ->get(); }
先程作ったpostsメソッドのあとにwhereメソッドを呼び出し条件を指定した上でgetメソッドを呼んでいます。
今回の場合は記事タイトルにLaravelが含まれている記事だけ抽出するというプログラムです。
HasManyの結果を並び替えよう(orderBy)
最後にソートする方法です。
これも従来のモデルを使った方法と変わりません。
function hoge() { $posts = Writer::find(1) ->posts() ->latest() ->get(); }
この場合はlatestメソッドを使って降順に並べています。
oldestメソッドを使えば昇順に並び替えることができます。
もちろん、whereとこの並び替えを組み合わせて使うこともできます。
まとめ
いかがでしょうか?
今回は1対多の基本的な解説を行いました。
実際にはもっと複雑なHasManyもありますが、今回は基本編ということで解説をしてきました。
HasManyのようなリレーション機能を使うことは実践の場でよくあります。
必ず覚えておきたいですね!