回答編集履歴

1

すみません、回答内容が誤っていたので削除しておきます。

2021/02/03 10:57

投稿

nak
nak

スコア696

test CHANGED
@@ -1,67 +1 @@
1
- モデルクラスの `getDetail()` メソッドの中で、 `query` メソッドを使っているからではないかと思われます。
2
-
3
- これを使ってしまうと、「クエリビルダ」になってしまい、クエリビルダの戻り値は、「stdClass を格納したコレクション」になってしまうので。
4
-
5
- getAttribute等の「Eloquentクラスに実装されている各種機能」を使いたい場合は、クエリビルダを使わないようにしてください。
6
-
7
-
8
-
9
- クエリビルダを使わない場合、今、getDetailメソッドの中でやっていらっしゃるような「クエリを複数回発行して、結果をまとめたい時はどうするの?」という疑問がでてくると思いますが、そういう作業は「Eloquentクラスの外(今回の登場ファイルの中から選ぶならコントローラー)」で行ってください。
10
-
11
-
12
-
13
- ↓getDetailメソッドの一部抜粋
14
-
15
-
16
-
17
- ```
18
-
19
- $payments = self::query() // ←ココ `query()` い。
1
+ ~~すみません、回答内容が誤っていたで削除しておきます(削除前回答が気になる方は、履歴を見てただければ)~~
20
-
21
- ->select([
22
-
23
- 'payments.amount AS amount',
24
-
25
- 'payments.created_at AS created_at',
26
-
27
- 'lessons.title AS lessons_title',
28
-
29
- ])
30
-
31
- ->where([
32
-
33
- ['user_teacher_id', '=', $user_id],
34
-
35
- ['payments.status', '=', 0],
36
-
37
- ])
38
-
39
- ->leftJoin('applications', 'payments.application_id', '=', 'applications.id')
40
-
41
- ->leftJoin('lessons', 'applications.lesson_id', '=', 'lessons.id');
42
-
43
- ```
44
-
45
-
46
-
47
-
48
-
49
- また、Eloquentの場合、JOINは使えないので、テーブルのリレーション機能を使ってください
50
-
51
-
52
-
53
- 参考:
54
-
55
- [https://qiita.com/mtakehara21/items/3cef9d12869d162e1ce9](https://qiita.com/mtakehara21/items/3cef9d12869d162e1ce9)
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
- 余談ですが、個人的に、あまりLaravelのEloquentは好きではないので(可読性は良くなるものの、クエリ効率が悪い。大量データを扱う時は、この「クエリ効率の悪さ」がネックになる)、個人開発であれば「クエリメソッドを使う替わりに、getAttributeメソッドを使うのをあきらめる」という選択もありかと思います。
64
-
65
- ただ、これはあまり一般的な考えではないと思いますので、チーム開発をしている場合には、あまりおススメしません(「普通のLaravel」に慣れている人が混乱します)。
66
-
67
- 素直にクエリビルダを諦めるほうが良いと思います。