回答編集履歴

6

fix typo

2022/07/22 08:00

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -69,7 +69,7 @@
69
69
  ```
70
70
 
71
71
  ```php
72
- $items = MItemSplit::with('item', 'itemSplitDetaisl')->get();
72
+ $items = MItemSplit::with('item', 'itemSplitDetails')->get();
73
73
 
74
74
  var_dump($items->toArray()); //コントローラから返すときは toArray() 不要
75
75
  ```

5

wip

2022/07/22 05:29

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -61,7 +61,7 @@
61
61
  {
62
62
  return $this->belongsTo(SMItem::class, 'item_id');
63
63
  }
64
- public function itemSplitDetail()
64
+ public function itemSplitDetails()
65
65
  {
66
66
  return $this->hasMany(MItemSplitDetail::class, 'item_split_id');
67
67
  }
@@ -69,7 +69,7 @@
69
69
  ```
70
70
 
71
71
  ```php
72
- $items = MItemSplit::with('item', 'itemSplitDetail')->get();
72
+ $items = MItemSplit::with('item', 'itemSplitDetaisl')->get();
73
73
 
74
74
  var_dump($items->toArray()); //コントローラから返すときは toArray() 不要
75
75
  ```

4

wip

2022/07/22 05:25

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -47,3 +47,29 @@
47
47
  - `A HasOne B` `B BelongsTo A`: A1個に対してB1個が存在する
48
48
 
49
49
  といった情報は読み取れません。
50
+
51
+ (追記)
52
+
53
+ 推測するに,正しいリレーションはこうじゃないですかね?
54
+
55
+ ```php
56
+ class MItemSplit
57
+ {
58
+ protected $hidden = [];
59
+
60
+ public function item()
61
+ {
62
+ return $this->belongsTo(SMItem::class, 'item_id');
63
+ }
64
+ public function itemSplitDetail()
65
+ {
66
+ return $this->hasMany(MItemSplitDetail::class, 'item_split_id');
67
+ }
68
+ }
69
+ ```
70
+
71
+ ```php
72
+ $items = MItemSplit::with('item', 'itemSplitDetail')->get();
73
+
74
+ var_dump($items->toArray()); //コントローラから返すときは toArray() 不要
75
+ ```

3

wip

2022/07/22 00:42

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -30,3 +30,20 @@
30
30
  …を書こうとしたんですが,テーブル構造が不明であるため,あるべき形を書こうとしても書くのが難しい状態です。現在のテーブル定義を提示していただけませんか?特に, **テーブル間のリレーション** を重点的に示していただきたいです。 `HasMany` `HasOne` `BelongsTo` `BelongsToMany` とかのアレです。
31
31
 
32
32
  ※ 蛇足ですが,変数の命名があまり良くないように思えます。 `$query` とされているものは,実際にはクエリではありません。 **クエリを実行して得た結果** です。
33
+
34
+ (以下追記)
35
+
36
+ 一般的なルールとして,Eloquent は **明示的な JOIN は使用禁止** です。一部使っていいケースはありますが,初心者は基本的には避けたほうが無難ですね。提示されたコードは,根本から直すべきということになります。
37
+
38
+ SQL は表指向の言語であり,階層構造を表現することに適しておりません。そのため今回のような「共通なものはまとめて子要素にしたい」などの階層構造にしたいニーズが有る場合,表としてそのまま取得する JOIN とクエリビルダを使ったコードを書いてしまうと,ゴールから離れてしまいます。
39
+
40
+ - [Eloquent:リレーション 9.x Laravel](https://readouble.com/laravel/9.x/ja/eloquent-relationships.html)
41
+
42
+ 一方リレーション機能は, SQL を使用してはいるものの,内部的には JOIN は殆ど使わずにバラバラに SQL を発行して取得してくるロジックになります。こちらは取得結果を階層化する整形を自動で行ってくれるため, **Eloquent と言えばリレーション** ぐらいの感覚でいたほうがよいでしょう。
43
+
44
+ 一度,上記のマニュアルを参考に,各モデル上でリレーションメソッドを定義してみてください。提示された SQL からもまだ
45
+
46
+ - `A HasMany B`: A1個に対してB複数が存在する
47
+ - `A HasOne B` `B BelongsTo A`: A1個に対してB1個が存在する
48
+
49
+ といった情報は読み取れません。

2

wip

2022/07/21 15:14

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -27,6 +27,6 @@
27
27
 
28
28
  ## Eloquent としての扱い
29
29
 
30
- …を書こうとしたんですが,テーブル構造が不明であるため,あるべき形を書こうとしても書くのが難しい状態です。現在のテーブル定義を提示していただけませんか?
30
+ …を書こうとしたんですが,テーブル構造が不明であるため,あるべき形を書こうとしても書くのが難しい状態です。現在のテーブル定義を提示していただけませんか?特に, **テーブル間のリレーション** を重点的に示していただきたいです。 `HasMany` `HasOne` `BelongsTo` `BelongsToMany` とかのアレです。
31
31
 
32
32
  ※ 蛇足ですが,変数の命名があまり良くないように思えます。 `$query` とされているものは,実際にはクエリではありません。 **クエリを実行して得た結果** です。

1

wip

2022/07/21 15:04

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -12,9 +12,9 @@
12
12
  }
13
13
  ```
14
14
 
15
- 一番外側のオブジェクト `{}` の中のエントリは,必ず **キー** と **値** のペアで無ければなりません。 A は `item_split_detail` というキーに対応していますが,B は対応するキーが存在しないので文法として無効です。
15
+ 一番外側のオブジェクト `{}` 直下のエントリは,必ず **キー** と **値** のペアで無ければなりません。 A は `item_split_detail` というキーに対応していますが,B は対応するキーが存在しないので文法として無効です。
16
16
 
17
- 代替案としては,以下のように配列の中に入れてしまうことです。また,配列に対するキーとしては英単語の複数形を採用するのが一般的であるため, `item_split_details` としています。
17
+ 代替案としては,以下のように配列の中に入れてしまうことです。また,配列に対するキーとしては英単語の複数形を採用するのが一般的であるため, `item_split_details` としています。(逆に, JSON の配列直下の値は文字列のキーを持つことができません。0番目,1番目,…という番目の情報しか与えることができません)
18
18
 
19
19
  ```json
20
20
  {