SQLではうまくいくのに、Laravelだとうまくデータが取得できない
解決したいこと
whereRawで複雑な条件のデータ取得をしたい
【環境】Laravel 5.5
業務日報の登録フォームで使用します。
登録時に、すでに登録済である日報データの日時と照らし合わせ、同じ日時で時間が重複している日報がないか確認するための処理です。
※作業ごとに分けて登録するような運用です。
※日付と時間を連結した日時でチェックしようとしています。
※このクエリで重複した件数が取得できることは確認済です。
発生している問題
クエリビルダで通すと、あるはずの重複データが取得できません。
クエリ実行後、logファイルから拾ったSQL文をそのままMYSQLに貼り付けるときちんと重複件数を拾ってくれるのですが、
laravel上だと取得件数が0件になります。
該当するソースコード
// リクエストの日報データ
$syain_code = 'testUser';
$nippou_date= '2022-03-04';
$start_time = '08:00';
$end_time = '17:00';
$start_time = $nippou_date." ".$start_time;
$end_time = $nippou_date." ".$end_time;
$start_time = new Carbon( $start_time );
$end_time = new Carbon( $end_time );
// 終了時刻が 0 時を超えた場合 ⇒ 日付を翌日に変換
if($end_time < $start_time){
$end_time->addDay();
}
$start_time = $start_time->format('Y-m-d H:i:s');
$end_time = $end_time->format('Y-m-d H:i:s');
$kuhaku = "' '";
$duplicates_nippouCNT = DB::table($my_db.'.t_nippou')
->where('t_nippou.syain_code', $syain_code)
->where('t_nippou.nippou_date', $nippou_date)
->whereRaw('( ? < CONCAT(CAST((CASE
WHEN
t_nippou.end_time < t_nippou.start_time
THEN
DATE_ADD(t_nippou.nippou_date, INTERVAL 1 DAY)
WHEN
t_nippou.start_time < t_nippou.end_time
THEN
t_nippou.nippou_date
END) AS CHAR), ?, t_nippou.end_time)
AND CONCAT(CAST(t_nippou.nippou_date AS CHAR), ?, t_nippou.start_time) < ? )', [ $start_time, $kuhaku, $kuhaku, $end_time ])
->count();
既に入力されている日報データ
-- t_nippouテーブル
no syain_code, nippou_date, start_time, end_time
1 'testUser', '2022-03-04', '10:00:00', '12:00:00'
2 'testUser', '2022-03-04', '16:00:00', '00:00:00'
3 'testUser', '2022-03-04', '05:00:00', '08:00:00'
-- no1,no2の2件を取得したい
logファイルクエリ成型後↓
これをMySQLで流すときちんと該当の2件が取得できます。
SELECT
COUNT(*) AS aggregate
FROM
`t_nippou`
WHERE `t_nippou`.`syain_code` = 'testUser'
AND `t_nippou`.`nippou_date` = '2022-03-04'
AND ('2022-03-04 08:00:00' < CONCAT(CAST((CASE
WHEN
t_nippou.end_time < t_nippou.start_time
THEN
DATE_ADD(t_nippou.nippou_date,
INTERVAL 1 DAY)
WHEN t_nippou.start_time < t_nippou.end_time THEN t_nippou.nippou_date
END)
AS CHAR),
' ',
t_nippou.end_time)
AND CONCAT(CAST(t_nippou.nippou_date AS CHAR),
' ',
t_nippou.start_time) < '2022-03-04 17:00:00')
自分で試したこと
・日付をフォーマットする⇒NG
・CASTをChar型からDATETIMEに変更してみる⇒NG
・CASTを全部消して実行⇒NG
・どこでうまくいかないのか確認するために、CASE WHEN文を消して実行⇒NG
その他かれこれ1日半いろいろ試しましたがうまくいきませんでした。
whereRawのバインドがうまくいってないのかな、と思ったのですが、SQLではうまくいくのに、laravelを通すとうまくいかない理由がわからず、いろいろ調べて検索しましたが、力不足です。
面倒なSQL文で申し訳ないのですが、もしよろしければ、どうかご教授お願いいたします。