回答編集履歴

2

ちょっと修正

2017/12/06 09:02

投稿

masaya_ohashi
masaya_ohashi

スコア9206

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

1

情報に合わせて追記

2017/12/06 09:02

投稿

masaya_ohashi
masaya_ohashi

スコア9206

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