概要
ユーザーが投稿した記事や購入予定のカート・商品など、ログインユーザーに関するもののみを利用したい場合。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, ]); } } |