【Laravel5】hasManyを使って1対多のテーブルリレーションを実現

hasMany

特定のユーザーの投稿だけを表示させる時などに1対多のテーブルリレーションを利用するととても便利です。Laravelでは簡単に実装が可能です。

実装方法

UserモデルとUsersテーブル、そしてPostモデルとPostsテーブルがある事が前提で話を進めます。

準備

特定のUserが投稿したPostを抽出する時の方法を例にしたサンプルです。

namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
  public function posts()
  {
    //引数にPostのモデルクラスを渡す
    return $this->hasMany(Post::class);
  }
}

記述

use App\User;

class PostController extends Controller
{

    public function get()
    {
        $posts = User::find(Auth::id())
                             ->posts()
                             ->get();
    }

}

findの引数は抽出したいUserのIDです。Auth::id()を利用する事でログインしているユーザーのPostを抽出できます。

hasMany で降順に並び替え

下記のように latest()を追記すると降順になります。昇順は oldest() を使います。

 $posts = User::find(Auth::id())
                      ->posts()
                      ->latest()
                      ->get();

hasMany で更に条件を絞り込む

他のカラムで絞り込みたい時はwhere()を使います。

$posts = User::find(Auth::id())
                     ->posts()
                     ->where('viewed', '>', '4')
                     ->get();
タイトルとURLをコピーしました