質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1991閲覧

Laravelでスタッフのエリアごとに分類して出力する方法

bws

総合スコア98

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/08/31 09:28

編集2020/09/02 08:06

下記コード、テーブルでviews/depts/index.blade.phpstaffsテーブルのareaで分けて以下のような表示で出力するにはどのようにしたらいいでしょうか?

部署1

  • スタッフ1
  • スタッフ2
西
  • スタッフ3
  • スタッフ4

部署2

  • スタッフ5
  • スタッフ6
西
  • スタッフ7
  • スタッフ8

よろしくお願いいたします。

テーブル

![イメージ説明

コード

php

1// Dept.php 2 3<?php 4 5namespace App; 6 7use Illuminate\Database\Eloquent\Model; 8 9class Dept extends Model 10{ 11 public $timestamps = false; 12 protected $table = 'depts'; 13 14 public function staffs() 15 { 16 return $this->hasMany('App\DeptStaff'); 17 } 18} 19

PHP

1// DeptStaff.php 2 3<?php 4 5namespace App; 6 7use Illuminate\Database\Eloquent\Model; 8 9class DeptStaff extends Model 10{ 11 public $timestamps = false; 12 protected $table = 'staff_depts'; 13 14 public function staff() 15 { 16 return $this->belongsTo('App\Staff'); 17 } 18} 19

PHP

1// Staff.php 2 3<?php 4 5namespace App; 6 7use Illuminate\Database\Eloquent\Model; 8 9class Staff extends Model 10{ 11 public $timestamps = false; 12 protected $table = 'staffs'; 13 14}

PHP

1// DeptController.php 2 3public function index() 4 { 5 $depts = Dept::all(); 6 return view('depts/index', [ 7 'depts' => $depts, 8 ]); 9 } 10

PHP

1// views/depts/index.blade.php 2 3@extends('layouts.app') 4 5@section('content') 6<div class="container"> 7 <div class="row justify-content-center"> 8 <div class="col-md-8"> 9 <table class="table table-condensed table-striped"> 10 <th>部署名</th> 11 <th>所属スタッフ</th> 12 <tbody id="sort_items"> 13 @foreach ($depts as $dept) 14 <tr id="item_{{ $dept->id }}" class="sort_item"> 15 <td>{{ $dept->name }}</td> 16 <td> 17 @foreach ($dept->staffs as $dept_staff) 18// ここでエリアごとにスタッフをわけたい 19 {{ $dept_staff->staff->name }} 20 @endforeach 21 </td> 22 </tr> 23 @endforeach 24 </tbody> 25 </table> 26 </div> 27 </div> 28</div> 29@endsection

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

staff_depts は多対多リレーション(BelongsToMany)における中間テーブルなので、基本的にモデルを作成する必要はありません

また、中間テーブルの命名ルールは、(モデル名単数形)_(モデル名単数形) でアルファベット順ですので、

staff_depts -> dept_staff です。

php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use App\Dept; 7 8/** 9 * Staff 10 */ 11class Staff extends Model 12{ 13 public function depts() 14 { 15 return $this->belongsToMany(Dept::class); 16 } 17}

php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use App\Staff; 7 8/** 9 * Dept 10 */ 11class Dept extends Model 12{ 13 public function staffs() 14 { 15 return $this->belongsToMany(Staffs::class); 16 } 17}

php

1class deptController extends Controller 2{ 3 public function index() 4 { 5 // Eager load を使うべし 6 $depts = Dept::with(['staffs'])->get(); 7 8 return view('depts/index', [ 9 'depts' => $depts, 10 ]); 11 } 12}
<tbody id="sort_items"> @foreach ($depts as $dept) <tr class="sort_item"> <td>{{ $dept->name }}</td> <td>{{ $dept->staffs->implode('name') }}</td> </tr> @endforeach </tbody>

投稿2020/08/31 09:41

編集2020/08/31 09:42
phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2020/09/01 07:13

どうして無反応なんだろ。
bws

2020/09/02 08:04

遅くなってしまって申し訳ありません。 大変勉強になる内容で本当に感謝しております。 ただこちらの質問が悪く、やりたいことがうまく伝えられなかったのでまとめていたところです。 またアドバイスいただいたとおり中間テーブルのモデル無しでリレーションすることが出来ました! やりたかったことは、以下のようにstaffテーブルのarea別にスタッフを表示したかったのです。 部署1 東 スタッフ1 スタッフ2 西 スタッフ3 スタッフ4 部署2 東 スタッフ5 スタッフ6 西 スタッフ7 スタッフ8 ・・・ もし可能であればアドバイスいただけるととても嬉しいです。 よろしくお願いします。
phper.k

2020/09/02 08:07

area を 外部テーブルに切り分け、リレーションで管理する方が、ソースコードは綺麗になりますね。
bws

2020/09/02 08:15

areaテーブルと、area_staffという中間テーブルを作成してって感じでしょうか。 リレーションで管理しない場合は、if文か何かで無理やり切り分けるような形になりますかね?
phper.k

2020/09/02 08:17

多対多じゃないでしょう? ただのBelongsTo ですよ
phper.k

2020/09/02 08:18 編集

とはいえ、現状 int なので、たいして手間は変わらないですね。 > if文か何かで無理やり切り分けるような形になりますかね? そうです。
bws

2020/09/02 08:21

ありがとうございます。 どうすればいいかわかりました! リレーションについても全く無知でした。勉強します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問