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

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

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

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

2回答

2156閲覧

append Laravel Column not found

rikutennis

総合スコア55

Laravel

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/04/28 10:47

編集2020/05/01 09:06

以下ようなメソッドで元のDBから合計値を算出し描写しています。
エラーコード

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tb_user_department.total_over_working_time' in 'where clause' (SQL: select count(*) as aggregate from tb_user_department where exists (select * from tb_department where tb_department.department_id = tb_user_department.department_id) and exists (select * from tb_user where tb_user.user_id = tb_user_department.user_id) and tb_user_department.total_over_working_time between 21 and 50)

php

1class DB extends Model{ 2 3 protected $appends= ['total_over_working_time']; 4 getTotalOverWorkingTimeAttribute(){ 5 //計算処理 6 return total_over_working_time; 7 } 8}

PHP

1/* 2 * 残業が20時間以下の絞り込み 3 * 4 * @param Builder $query 5 * @return float 6 */ 7 public function scopefilterBytotalOverWorkingTime() 8 { 9 return $query->whereBetween('tb_user_department.total_over_working_time', [0,20]); 10 }

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

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

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

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

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

guest

回答2

0

SQLではできません。
collection
に実装されているメソッドである程度絞れますが、速度面ではSQLに劣るでしょう

投稿2020/04/28 12:48

mikkame

総合スコア5036

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

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

rikutennis

2020/05/01 09:07

カラムが存在しないとなってしまいます。 appendのカラムは後から生成されてしまうのでしょうか。
mikkame

2020/05/01 10:53

回答に書いたようにSQLではできません。 getXXXAttributeはデータベースに変更を加えるものではなく モデルインスタンス(いわゆる行)に対してGetterを作るものです。
guest

0

自己解決

生のSQLを書いてエイリアスを作り、それを使ってクエリを作って実装。

sql

1$sql = <<< SQL 2SELECT 3 user_id, 4 SEC_TO_TIME( 5 SUM( 6 TIME_TO_SEC(work_time) - TIME_TO_SEC('8:00:00') 7 ) 8 ) AS total_overtime 9FROM 10 tb_user_work_time 11WHERE 12 work_time > CAST('8:00:00' AS TIME) 13GROUP BY 14 user_id 15HAVING 16 total_overtime <= CAST('20:00:00' AS TIME); 17SQL; 18$results = DB::select($sql); 19$query->whereHas('users', function ($query) use ($results) { 20 foreach ($results as $result) { 21  $query->orWhere('user_id', $result->user_id); 22 } 23});

投稿2020/05/08 08:55

rikutennis

総合スコア55

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問