概要
ユーザーが投稿した記事や購入予定のカート・商品など、ログインユーザーに関するもののみを利用したい場合。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
として持ち、外部キー制約を設定している。
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql> DESCRIBE posts; +------------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-----------------+------+-----+---------+----------------+ | id | bigint unsigned | NO | PRI | NULL | auto_increment | | user_id | bigint unsigned | NO | MUL | NULL | | | comment | varchar(200) | NO | | NULL | | | image_name | varchar(100) | NO | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------+-----------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec) |
以下はログインユーザーの全記事をPostController
のindex
アクションで取得し、index
ビューで表示させる例。ビュー側で受け取った$posts
にログインユーザーが投稿した記事だけが配列で格納される。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class PostController extends Controller { .... public function index() { $posts = Post::where('user_id', \Auth::user()->id)->get(); return view('posts.index', [ 'title' => '投稿一覧', 'posts' => $posts, ]); } } |
モデルのリレーションを定義する方法
手順
User
モデルにモデル名の複数形(テーブル名に相当)でメソッドを定義し、リレーションを記述する。
1 2 3 4 5 6 7 8 |
class User extends Authenticatable { .... // リレーション設定 public function メソッド名() { return $this->hasMany('App\モデル名'); } } |
これによってUser
モデルの属性にメソッド名と同名のプロパティーが追加され、そのユーザーのid
を外部キーに持つモデルのデータのみを取り出すことができる。
そしてコントローラーのアクションで、ログインユーザーのプロパティーでログインユーザーのidを持つデータのみを取得できる。
1 2 3 4 5 6 7 8 9 |
class コントローラー extends Controller { .... public function アクション() { $login_users_data = \Auth::user()->メソッド名; .... } } |
例
以下は先と同じPost
モデルを扱う例。
まずUser
モデルにPost
の複数形(テーブル名)でposts()
メソッドを定義し、hasMany(App\Post)
を戻り値とする。
hasMany()
は元のモデル(User
)が複数の引数モデルを持つことから、User
のインスタンスに属する複数のデータの配列を返す- このリレーション設定によって、
User
モデルにposts
プロパティーが加えられ、User
インスタンスに属するPost
の配列を取得できる
1 2 3 4 5 6 7 8 |
class User extends Authenticatable { .... // リレーション設定 public function posts() { return $this->hasMany('App\Post'); } } |
これでユーザーのインスタンスのposts
プロパティーに、そのユーザーが投稿した記事だけが格納される。
コントローラーではログインユーザー(\Auth::user()
)のposts
プロパティーを参照すればよいので、以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class PostController extends Controller { .... public function index() { $posts = \Auth::user()->posts; return view('posts.index', [ 'title' => '投稿一覧', 'posts' => $posts, ]); } } |