前提・実現したいこと
LaravelのCollection同士を結合
(イメージとしてはDB left join)
そのコマンドがあるかどうか?
データベース(案)
Collection出力の元となるデーターベースです。
users
| id | name |
|---|---|
| 1 | 名前1 |
| 2 | 名前2 |
| 3 | 名前3 |
titles
| id | name |
|---|---|
| 1 | タイトル1 |
| 2 | タイトル2 |
| 3 | タイトル3 |
items
| id | title_id | name |
|---|---|---|
| 1 | 1 | アイテム1 |
| 2 | 1 | アイテム2 |
| 3 | 1 | アイテム3 |
| 4 | 2 | アイテム4 |
| 5 | 2 | アイテム5 |
| 6 | 2 | アイテム6 |
| 7 | 3 | アイテム7 |
| 8 | 3 | アイテム8 |
| 9 | 3 | アイテム9 |
datas
| id | user_id | title_id | item_id |
|---|---|---|---|
| 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 5 |
| 3 | 1 | 3 | 8 |
以上のデータベースから
datasより名前1(user_id 1)のデータを以下のように出力し
結果
php
1$collection = collect([ 2 ['id' => 1, 'title' => 'タイトル1', 'value' => 2,'name' => 'アイテム2'], 3 ['id' => 2, 'title' => 'タイトル2', 'value' => 5,'name' => 'アイテム5'], 4 ['id' => 3, 'title' => 'タイトル3', 'value' => 8,'name' => 'アイテム8'] 5]);
以上の構成であればデーターベースでやれば簡単なのですが、
それをCollectionで似たようなことが、できないかというのが今回の質問の意図です。
また理由の1つに、上記のテーブルが一部jsonデータで保存されていた場合にどのようにすればいいかと方法に悩んでしまいました。
Collectionであれば以下の方法でjsonデータをcollect化できますので。。
collect(json_encode(jsonデータ))
質問
2つのCollectionを結合して1つのCollectionデータを作成を考えています。
php
1$collection_a = collect([ 2 ['id' => 1, 'value' => 2], 3 ['id' => 2, 'value' => 5], 4 ['id' => 3, 'value' => 8], 5]); 6 7$collection_b = collect([ 8 ['id' => 1, 'title' => 'タイトル1', 9 'items'=>[ 10 ['id' => 1, 'name' => 'アイテム1'], 11 ['id' => 2, 'name' => 'アイテム2'], 12 ['id' => 3, 'name' => 'アイテム3'] 13 ] 14 ], 15 ['id' => 2, 'title' => 'タイトル2', 16 'items'=>[ 17 ['id' => 4, 'name' => 'アイテム4'], 18 ['id' => 5, 'name' => 'アイテム5'], 19 ['id' => 6, 'name' => 'アイテム6'] 20 ] 21 ], 22 ['id' => 3, 'title' => 'タイトル3', 23 'items'=>[ 24 ['id' => 7, 'name' => 'アイテム7'], 25 ['id' => 8, 'name' => 'アイテム8'], 26 ['id' => 9, 'name' => 'アイテム9'] 27 ] 28 ] 29]);
以上の2つのCollectionを以下のように出力を考えています。
php
1$collection_c = collect([ 2 ['id' => 1, 'title' => 'タイトル1', 'value' => 2,'name' => 'アイテム2'], 3 ['id' => 2, 'title' => 'タイトル2', 'value' => 5,'name' => 'アイテム5'], 4 ['id' => 3, 'title' => 'タイトル3', 'value' => 8,'name' => 'アイテム8'] 5]);
foreachで回す方法しかないのでしょうか?
まわりくどい方法は思いつくのですが
Laravel自体はまだ始めたばっかで適切なコマンド・方法があるかと思った次第です。
スペルミスがかなり目に付いてしまうので修正していただければと。
Larvel larabel ではなくLaravel
リファレンス読んだ感じ、色々駆使すればできそうですけど
https://readouble.com/laravel/5.7/ja/collections.html
まだ試してないので調整してみます。
要件確認です。
collect()されたものをマージということですよね?
提示されている配列は仮のものとは思いますが、大目的が別にあるのでしたらそれもあった方がよいかもしれません。
~~~最後1行余計でした。編集削除しました。
おっしゃる通りです。あとでcollectという面で言いますと元々、collection_a,bはEloquentでDBから出力したイメージになります。なのでDB出力時にcollection_cに調整してやればとも思います。
データベース部分も含めて全体イメージを質問に追加します。
回答2件
あなたの回答
tips
プレビュー