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

回答編集履歴

1

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

2021/02/03 10:57

投稿

nak
nak

スコア696

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