2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

○分以内に登録されたDBのレコードを取得する方法

Last updated at Posted at 2019-11-22

### 概要
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();

これでうまいこと取ってこれました。めでたし。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?