Laravel – ログインユーザーのデータのみ取り出す

概要

ユーザーが投稿した記事や購入予定のカート・商品など、ログインユーザーに関するもののみを利用したい場合。1対多のリレーションの1から多のデータ群を取得する。

以下のいずれかの方法がある。

  • モデルのwhere()->get()で抽出する
  • Userモデルにリレーションを定義し、Userのプロパティーとして取得する

where()メソッドを使う方法

手順

全ての記事を取得するならコントローラーのアクションでPost::all()として取り出すが、この場合はwhere()メソッドで全データのうちuser_idがログインユーザーのidと同じデータだけを抽出する。

SQLではWHERE user_id = ログインユーザーidとなるが、Laravelでは以下のように書く。

モデル::where('モデルのユーザーid', \Auth::user()->id)->get()

例えばユーザー認証は設定済みとして、ユーザーの投稿記事モデルPostsを定義済みとする。Postモデルは記事の投稿ユーザーのIDをuser_idとして持ち、外部キー制約を設定している。

以下はログインユーザーの全記事をPostControllerindexアクションで取得し、indexビューで表示させる例。ビュー側で受け取った$postsにログインユーザーが投稿した記事だけが配列で格納される。

モデルのリレーションを定義する方法

手順

Userモデルにモデル名の複数形(テーブル名に相当)でメソッドを定義し、リレーションを記述する。

これによってUserモデルの属性にメソッド名と同名のプロパティーが追加され、そのユーザーのidを外部キーに持つモデルのデータのみを取り出すことができる。

そしてコントローラーのアクションで、ログインユーザーのプロパティーでログインユーザーのidを持つデータのみを取得できる。

以下は先と同じPostモデルを扱う例。

まずUserモデルにPostの複数形(テーブル名)でposts()メソッドを定義し、hasMany(App\Post)を戻り値とする。

  • hasMany()は元のモデル(User)が複数の引数モデルを持つことから、Userのインスタンスに属する複数のデータの配列を返す
  • このリレーション設定によって、Userモデルにpostsプロパティーが加えられ、Userインスタンスに属するPostの配列を取得できる

これでユーザーのインスタンスのpostsプロパティーに、そのユーザーが投稿した記事だけが格納される。

コントローラーではログインユーザー(\Auth::user())のpostsプロパティーを参照すればよいので、以下のようになる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です