### 概要
SNS認証のために5分以内に同じ電話番号がDBに10個以上登録されていればエラーになる(しばらくその電話番号で登録できなくなる)、という実装をしようとしていたため、created_atに登録されている時間で5分以内の処理をしようと思ったのですが、その際詰まってしまったので備忘録メモ。
### 1つ目の詰まったところ
コントローラーに送られてきた$requestの中身を確認しようとしたところ、created_atのカラムがnullに!
これじゃ5分以内の部分が実装できない!でも他のテーブルではちゃんとcreated_atの値が入っているのになぜ??と焦ったのですが、そもそもcreated_atはcreateされるときに値が入るので、createの処理前の値をvar_dumpで見ても入ってなくて当然というとても初歩的なことに後から気づかされました。
### 2つ目の詰まったところ
なかなか解決できなかった下記のエラー。
deleted_atと買いてあるが、deleted_atなんてカラム作ってなかったためなぜdeleted_atが????状態。
SQLSTATE[42S22]: Column not found: 1054 Unknown column'phone_number_slotlings.deleted_at' in 'where clause' (SQL: select exists(select * from `phone_number_slotlings` where `phone_number` is null and`phone_number_slotlings`.`deleted_at` is null) as `exists`)
いろいろ試してもわからなかったため相談してみると、継承元のBaseModelにuse SoftDeletesの記載があるためdeleted_atのカラムがないとエラーになるとのこと。
必要ないカラムでしたが、存在しても特に問題はないのでカラムを追加することにしました。
継承元もエラー時にどうなっているか一応確認はしていたのですが、use SoftDeletesが何をしているかまで確認せず...今思うと思いっきりDeleteって書いてあるのに。
DB周りのエラーは関係ありそうなモデルをもっと丁寧に確認しようと思います。
use SoftDeletesについて下記を参考にしました。便利な機能!
https://qiita.com/amymd/items/072b6b60dc5e4331b254
### 3つ目の詰まったところ
5分以内に同じ電話番号がDBに登録されているかどうかの実装が一番時間かかりました。
時間データはdate("Y-m-d H:i:s")のように記載して処理することができますが、特に入力せずにdate("Y-m-d H:i:s")のまま使用すると、現在時間を取得してくれるようです。
気づくのに時間かかった...
date("Y-m-d H:i:s") //現在時刻取得
現在時間から●分前は、下記のようにして取得できます。
date("Y-m-d H:i:s", strtotime("-● min")) //現在時刻から●分前
A〜B(期間)以内の検索は、whereBetweenというメソッドがあったので下記を参考にして実装しました。
https://codeday.me/jp/qa/20190301/344067.html
$hoge = Hoge::query();
$hoge->whereBetween('created_at', [date("Y-m-d H:i:s", strtotime("-5 min")), date("Y-m-d H:i:s")])->get();
これでいけるはず、、、が。取得できない。
var_dump(date("Y-m-d H:i:s", strtotime("-5 min")));
var_dump(date("Y-m-d H:i:s");
でみると確かに時間が取得できているのになぜ...?
date("Y-m-d H:i:s")とdate("Y-m-d H:i:s", strtotime("-5 min"))をそれぞれ変数に格納してから使用するとうまくいきました。
$start = date("Y-m-d H:i:s", strtotime("-● min"));
$end = date("Y-m-d H:i:s");
$phoneNumberSlotling = $phoneNumberSlotling->whereBetween('created_at', [$start, $end])->get();
これでうまいこと取ってこれました。めでたし。