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

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

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

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

PHP

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

Q&A

解決済

1回答

4046閲覧

勤怠打刻機能 休憩時間を算出させてviewに表示させたい

TAKU9

総合スコア2

Laravel

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

PHP

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

0グッド

0クリップ

投稿2021/10/29 13:14

実現させたいこと

現在勤怠打刻機能を作成しております。
休憩時間を何回でも取得できるように勤怠打刻テーブル(stamps)、休憩打刻テーブル(rests)を1対多のリレーションをさせています。
現在は(stamps)にカラム(total_rest)を持たせ、(rests)で休憩時間を算出してカラム(rest_time)に値を入れてwhere('stamp_id',$timestamp->id)->sum('rest_time')として合計値を('stamps.total_rest')に入れています。
やりたいこととしては(stamps.total_rest)を使わずに休憩テーブル(rests)の同じ外部キー(stamp_id)を持った休憩時間の合計値を算出してviewに表示させたいです。

テーブル仕様

イメージ説明

ソースコード

Controller

1 2public function showTable() 3 { 4 $user = Auth::user(); 5 $date = date("Y-m-d"); 6 $stampDate = Stamp::select('stamp_date')->get(); 7 if (!$stampDate) { 8 return redirect()->back()->with(['message' => '勤務履歴がありません', 'status' => 'alert']); 9 } 10 11 $stamps = Stamp::join('users', 'users.id', 'user_id') 12 // ->join('rests','stamps.id','stamp_id') 13 ->where('stamp_date', $date) 14 ->orderBy('stamps.updated_at','asc') 15 ->paginate(5); 16 17 return view('showTable', compact('stamps', 'date')); 18 } 19 20 public function search(Request $request) 21 { 22 $date = $request->date; 23 $stamps = Stamp::join('users', 'users.id', 'user_id') 24 ->where('stamp_date', $date) 25 ->orderBy('stamps.updated_at', 'asc') 26 ->paginate(5); 27 28 return view('showTable', compact('stamps', 'date')); 29 }

view

1<x-app-layout> 2 <x-slot name="header"> 3 <div class="flex justify-between"> 4 <h2 class="font-semibold text-xl text-gray-800 leading-tight"> 5 勤務一覧 6 </h2> 7 <div class="text-xl"> 8 <p>本日の日付</p> 9 <div>{{date('Y-m-d')}}</div> 10 </div> 11 </div> 12 </x-slot> 13 14 <div class="py-12"> 15 <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> 16 <section class="text-gray-600 body-font"> 17 <div class="container px-5 mx-auto"> 18 <div class="flex flex-col justify-around text-center w-full mb-20"> 19 <h1 class="sm:text-4xl text-3xl font-medium title-font mb-2 text-gray-900"> 20 {{$date}}の勤務一覧 21 </h1> 22 <form method="post" action="{{route('search')}}"> 23 @csrf 24 @method('post') 25 <div> 26 <label for="date" class="mr-2">日付を選択して下さい</label> 27 <input type="date" name="date" value="date" id="date" class="mr-2"> 28 <button class="text-white bg-blue-500 border-0 py-2 px-6 focus:outline-none hover:bg-blue-600 rounded">検索</button> 29 </div> 30 </form> 31 </div> 32 <div class="lg:w-2/3 w-full mx-auto overflow-auto"> 33 <div class="text-xl text-blue-600 ml-4">{{$date}}勤務一覧を表示中</div> 34 35 <table class="table-auto w-full text-left whitespace-no-wrap"> 36 <thead> 37 <tr> 38 <th class="px-4 py-3 title-font tracking-wider font-medium text-gray-900 text-sm bg-gray-100 rounded-tl rounded-bl">名前</th> 39 <th class="px-4 py-3 title-font tracking-wider font-medium text-gray-900 text-sm bg-gray-100">勤務開始</th> 40 <th class="px-4 py-3 title-font tracking-wider font-medium text-gray-900 text-sm bg-gray-100">勤務終了</th> 41 <th class="px-4 py-3 title-font tracking-wider font-medium text-gray-900 text-sm bg-gray-100">休憩時間</th> 42 <th class="px-4 py-3 title-font tracking-wider font-medium text-gray-900 text-sm bg-gray-100">勤務時間</th> 43 </tr> 44 </thead> 45 <tbody> 46 <tr> 47 @foreach($stamps as $stamp) 48 <td class="px-4 py-3">{{$stamp->name}}</td> 49 <td class="px-4 py-3">{{$stamp->start_work}}</td> 50 <td class="px-4 py-3">{{$stamp->end_work}}</td> 51 <td class="px-4 py-3">{{$stamp->total_rest}}</td> 52 <td class="px-4 py-3">{{gmdate("H:i:s",(strtotime($date.$stamp->end_work)-strtotime($date.$stamp->start_work)))}}</td> 53 </tr> 54 @endforeach 55 </tbody> 56 </table> 57 {{$stamps->links()}} 58 </div> 59 </div> 60 </section> 61 </div> 62 </div> 63</x-app-layout> 64

試したこと

join('rests','stamps.id','stamp_id')としてviewの部分でforeach($stamp->rests as $rest)で回して算出してみたが1レコードずつ表示され休憩時間の合計値を取得できない。

なにかアドバイス頂けると幸いです。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

やりたいこととしては(stamps.total_rest)を使わずに休憩テーブル(rests)の同じ外部キー(stamp_id)を持った休憩時間の合計値を算出してviewに表示させたいです

restsテーブルに対して、stamp_idごとの合計休憩時間を算出するクエリーと
テーブルstampsをjoinすれば良さそうな気がする。
サブクエリーとのjoinには、メソッド joinSub() leftJoinSub() rightJoinSub()を使うけど、
必ずしも休憩時間があるわけではないだろうからstampsテーブルに対するleftJoinSub()ではないだろうか。

select stamp_id, sum(rest_time) as sum_rest_time
from rests
group by stamp_id

となるサブクエリーを表現すればいいんだとすると、

php

1$rests = DB::table('rests')->select('stamp_id', DB::raw('SUM(rest_time) as sum_rest_time'))->groupBy('stamp_id');

みたいになるのかな。(机上のみ)

SQLがわかっててクエリビルダでの表現がわからないときは、
こちらを参考にすると良いです:

Laravel クエリビルダ記法まとめ
→サブクエリをJOIN を参照

投稿2021/11/04 04:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

TAKU9

2021/11/04 06:21

問題解決できました。 いままでクエリに対してあまり理解ができていなかったのでいい機会となりました。引き続き理解を深めていきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問