teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ちょっと修正

2017/12/06 09:02

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -17,6 +17,7 @@
17
17
  ]
18
18
  ```
19
19
 
20
- `with`は`get`等の取得の時点でリレーションしたモデルも全て取得するためのメソッドです。Eloquentで取得したモデルは、`$user->belong_user`とリレーションした要素にアクセスするまで、`$user`には`belong_user`のデータは含まれておりません。`->belong_user`とアクセスしたとき、初めてSQLが実行されて`belong_user`の中身が埋め込まれます。これは「別にアクセスしないかもしれないデータまで全部取っとくとメモリも処理速度も無駄」という仕組みで、「遅延ロード」と呼ばれます。
21
- これを先に済ましてしまおうぜ!というのが`with`メソッドです。こういった「先取りロード」のことを「Eagerロード」といいます。
20
+ `with`は`get`等の取得の時点でリレーションしたモデルも全て取得するためのメソッドです。Eloquentで取得したモデルは、`$user->belong_user`とリレーションした要素にアクセスするまで、`$user`には`belong_user`のデータは含まれておりません。`->belong_user`とアクセスしたとき、初めてSQLが実行されて`belong_user`の中身が埋め込まれます。これは「別にアクセスしないかもしれないデータまで全部取っとくとメモリも処理速度も無駄」という仕組みで、「遅延ロード」と呼ばれます。しかし、この場合逆に「for等で全てのuserのbelong_userにアクセスする場合、アクセスしたuserの数分だけSQLがガンガン実行される」というデメリットもあります。
21
+
22
+ これを「最初にuser取ってくるときに、ついでに一つのクエリでbelong_userもまとめて取ってしまおうぜ!」というのが`with`メソッドです。こういった「先取りロード」のことを「Eagerロード」といいます。
22
23
  試しに`with`ありとなしで`dd`等で`$user->toArray()`を表示してみてください。`with`を使った場合、`belong_user`以下が含まれているのが確認できるかと思います。

1

情報に合わせて追記

2017/12/06 09:02

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -1,4 +1,22 @@
1
1
  withを使います。
2
2
  ```PHP
3
- $users = Tables1::where('tokuten', '>' ,60)->with('リレーション名')->get();
4
- ```
3
+ $users = Tables1::where('tokuten', '>' ,60)->with('belong_user')->get();
4
+ ```
5
+
6
+ こうすることで、RESTのレスポンスとしては以下のような形になります。
7
+ ```JavaScript
8
+ [
9
+ {
10
+ user_id:1,
11
+ tokuten:100,
12
+ belong_user: {
13
+ user_id:1,
14
+ user_name: 'John'
15
+ }
16
+ }
17
+ ]
18
+ ```
19
+
20
+ `with`は`get`等の取得の時点でリレーションしたモデルも全て取得するためのメソッドです。Eloquentで取得したモデルは、`$user->belong_user`とリレーションした要素にアクセスするまで、`$user`には`belong_user`のデータは含まれておりません。`->belong_user`とアクセスしたとき、初めてSQLが実行されて`belong_user`の中身が埋め込まれます。これは「別にアクセスしないかもしれないデータまで全部取っとくとメモリも処理速度も無駄」という仕組みで、「遅延ロード」と呼ばれます。
21
+ これを先に済ましてしまおうぜ!というのが`with`メソッドです。こういった「先取りロード」のことを「Eagerロード」といいます。
22
+ 試しに`with`ありとなしで`dd`等で`$user->toArray()`を表示してみてください。`with`を使った場合、`belong_user`以下が含まれているのが確認できるかと思います。