回答編集履歴
6
fix typo
test
CHANGED
@@ -69,7 +69,7 @@
|
|
69
69
|
```
|
70
70
|
|
71
71
|
```php
|
72
|
-
$items = MItemSplit::with('item', 'itemSplitDetais
|
72
|
+
$items = MItemSplit::with('item', 'itemSplitDetails')->get();
|
73
73
|
|
74
74
|
var_dump($items->toArray()); //コントローラから返すときは toArray() 不要
|
75
75
|
```
|
5
wip
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
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
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
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
test
CHANGED
@@ -12,9 +12,9 @@
|
|
12
12
|
}
|
13
13
|
```
|
14
14
|
|
15
|
-
一番外側のオブジェクト `{}` の
|
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
|
{
|