deptControllerで取得した下記のような$deptsコレクションを、areaごとに出力したいので、部署→エリア→スタッフになるように操作したいです。
理由はblade側にif文などを書きたくないからです。
どのようにしたら良いでしょうか?
よろしくお願いします・
関連する質問
やりたいことは以前の二つの質問から変わっていません。
表示したいHTML
変更したいデータ
[{ "id":1, "name":"部署名1", "staffs":[{ "id":1, "name":"スタッフ1", "area":{ "id":1, "name":"東", }, "pivot":{ "dept_id":1, "staff_id":1 } },{ "id":2, "name":"スタッフ2", "area":{ "id":1, "name":"東", }, "pivot":{ "dept_id":1, "staff_id":2 } },{ "id":3, "name":"スタッフ3", "area":{ "id":2, "name":"西", }, "pivot":{ "dept_id":1, "staff_id":3 } }, },{ "id":2, "name":"部署名2", "staffs":[{ "id":4, "name":"スタッフ4", "area":{ "id":1, "name":"東", }, "pivot":{ "dept_id":2, "staff_id":4 } },{ "id":5, "name":"スタッフ5", "area":{ "id":2, "name":"西", }, "pivot":{ "dept_id":2, "staff_id":5 } },{ "id":6, "name":"スタッフ6", "area":{ "id":2, "name":"西", }, "pivot":{ "dept_id":2, "staff_id":6 } }, }]
期待するデータ
[{ "id":1, "name":"部署名1", "area": { "id": 1, "name": "東", "staffs":[ { "id":1, "name":"スタッフ1", "area":{ "id":1, "name":"東", } } }, .... ]
テーブル
モデル
<?php namespace App; use Illuminate\Database\Eloquent\Model; use App\Dept; use App\Area; /** * Staff */ class Staff extends Model { public function depts() { return $this->belongsToMany(Dept::class); } public function area() { return $this->belongsTo(Area::class); } }
class deptController extends Controller { public function index() { // このdeptsを操作したい $depts = Dept::with(['staffs.area'])->get(); return view('depts/index', [ 'depts' => $depts, ]); } }
<table class="table table-condensed table-striped"> <th>部署名</th> <th>所属スタッフ</th> <tbody id="sort_items"> @foreach ($depts as $dept) <tr id="item_{{ $dept->id }}" class="sort_item"> <td>{{ $dept->name }}</td> <td> // ここに東西で分けてスタッフを表示したい // ifを使いたくない @foreach($dept->areas as $area) <div>{{$area->name}}</div> <div>{{ $area->staffs->implode('name')}}</div> @endforeach </td> </tr> @endforeach </tbody> </table>
if文を使用した場合
<table class="table table-condensed table-striped"> <th>部署名</th> <th>所属スタッフ</th> <tbody id="sort_items"> @foreach ($depts as $dept) <tr id="item_{{ $dept->id }}" class="sort_item"> <td>{{ $dept->name }}</td> <td> <div>東</div> @foreach ($dept->staffs as $staff) @if ($staff["areas"]->id === 0) {{ $staff["name"]}} @endif @endforeach <div>西</div> @foreach ($dept->staffs as $staff) @if ($staff["areas"]->id === 1) {{ $staff["name"]}} @endif @endforeach </td> </tr> @endforeach </tbody>
部署→エリア→スタッフというのが、どのような構造のデータを期待しているのが分かりにくいので、コードで書いていただけると助かります。
あと前回の質問でコレクションのGroupByの使用をアドバイスされたようですが、それは試してみたのでしょうか。
ありがとうございます。期待するデータを追記させていただきました。
GroupByを使用してみましたが、どうしても期待するような構造にならずに困っているところです。
最終的にどのように出力したいのか、回答するものには伝わっていないですよ。
まず、 if を使って書いてみてください。最終的にどんなHTMLを出力したいのか曖昧なので、そのものずばりの回答が書けません。
bladeを追記していました。
すみません、foreachを使いたくないではなくifを使いたくないでした。
@bwsさん
ifを使わずに書きたいという要件は百も承知です。
最終的にどんなHTMLを出力したいのかを聞いています。
そもそもあなたはifを使って書いたら望んでいる形で書けるのかも確認したいのです。
コレクションも結局は配列がたオブジェクトなので、出力したい形に配列組み直せば良いのですけど、Laravel度外視でPHPでできますか?
できないのでしたらLaravelはいったん忘れた方が良いです。
@foreach($dept->areas as $area)
<div>{{$area->name}}</div>
<div>{{ $area->staffs->implode('name')}}</div>
@endforeach
このように表示したいのですが、これでは伝わりませんか?すみません。何を書いたらいいのかわかりません。
Laravelいったん忘れてください。基盤となるPHPとオブジェクトの概念が全く足りてません。
あと、もしかしたらhtmlも。
それはエラーで出力できないですよね?
ifを使えばできることがわかっているなら、まずはifを使って書いてみてください。
語弊があるかもですが、「ifすら使えないのに、そんな高度なコードを教えたところで、保守できるの?」って思っちゃうんですよ。
ありがとうございます。
if文で書いた場合のコードを追記しました。
このように書くのが嫌だったので、方法を質問→リレーションが悪いかもしれない→リレーションではできないからコレクションの操作という流れで質問させていただいております。
その考えの流れが分かるように質問を書いてくれれば、そう汲み取って回答を進めることができるはずです。
とりあえず回答はしておきました
過去の質問ですが、質問の書き方としては以下のような書き方をすると意図が伝わりやすいでしょう。
https://teratail.com/questions/184240
ありがとうございます。参考にさせていただきます。
わからないことが言語化できればGoogle検索ももうちょっと頑張れそうなんですが、なかなか言葉にするのも難しいですね。
回答1件
あなたの回答
tips
プレビュー

