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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

4回答

1686閲覧

LaravelでMysqlに値が登録されているか確認するsql文の書き方(の直し方)を知りたい

lkjgffh

総合スコア37

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/12/22 03:08

編集2017/12/22 03:10

laravel5.5でカスタムバリデーションを作っています
ユーザーログインの際にすでに登録されている電話番号であるかの確認をしたいので

SELECT COUNT(*) FROM admins WHERE telephone_number = 09088888888;

と言うsql文をLaravelのapp/Rulesの中に作ったバリデーションファイルで実行させたいです

現在

$confirmationTelNum = DB::table('admins')->count(*) ->where telephone_number = ($_POST["telephone_number"]);

と言うふうに書いているのですが->count(*)のところでエラーが出ています。(Xcodeと言うエディタで赤い下線が出ているので間違っているのだろうと判断しました)

知りたいことは2つで
1、SELECT COUNT(*) FROM admins WHERE telephone_number = formから受け取った値;
のSql文をLaravelではどのように書けばいいのか

2、LaravelでSql文を書いた際、書き方があっているか確認するためにテストをしたいのですが正常に動くか確認するにはどうしたら良いのか?
と言う2点です

そのsql文そのものが機能するかはMysqlで直接実行するとして、LaravelでLaravelの書き方で書いたSql文があっているか確認する方法はあるのでしょうか?

わかる方には非常に簡単なことだと思うので初歩的な質問で申し訳ないのですが、どなたかご教授いただけないでしょうか?

環境
Laravel5.5
DB Mysql
PC Mac
環境構築 Vagrant
VirtalBox
Homestead

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

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

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

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

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

guest

回答4

0

いくつかアドバイスです。

###ユーザーログインの際にすでに登録されている電話番号であるかの確認をしたい

これだけで良いのであれば、カスタムバリデーションを作らずとも、用意されているuniqueを使うのが妥当だと思います。
詳細はこのページを参照すると良いでしょう。
例えば、adminsテーブルに telephone_numberがあるとすると

'telephone_number' => 'unique:admins,telephone_number'

にすればOKです。

ちなみに、SQLの扱い方も書いておきます。

Sql文をLaravelではどのように書けばいいのか

マニュアルはここ
count(*)の使い方ですが…DB::rawが使えます

->select(DB::raw('count(*) as count'))

正常に動くか確認するにはどうしたら良いのか?

これは、クエリビルダの最後にtoSQLを使いましょう。参考ページ

SQL化した文字列をdd使って出せばデバッグしやすいですよ。

投稿2017/12/22 03:39

編集2017/12/22 03:40
motuo

総合スコア3027

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

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

lkjgffh

2017/12/22 03:45

シンプルなやり方を教えてくださってありがとうございます。活用させていただきます
guest

0

ベストアンサー

1、SELECT COUNT(*) FROM admins WHERE telephone_number = formから受け取った値;
のSql文をLaravelではどのように書けばいいのか

DB::select(DB::raw('COUNT(*)')) ->from('admins') ->where('telephone_number', '=', $form) ->get();

個人的にはEloquentモデルを経由した書き方の方が良いと思います。

2、LaravelでSql文を書いた際、書き方があっているか確認するためにテストをしたいのですが正常に動くか確認するにはどうしたら良いのか?

tinkerコマンドを使って確認するのが良いです。

$ php artisan tinker >>> DB::select(DB::raw('COUNT(*)'))->from('admins')->get() >>> DB::select(DB::raw('COUNT(*)'))->from('admins')->where('telephone_number', '=', $form)->get()

途中途中で実行して、結果が合ってるか確認できます。

そのsql文そのものが機能するかはMysqlで直接実行するとして、LaravelでLaravelの書き方で書いたSql文があっているか確認する方法はあるのでしょうか?

>>> $from = '0120-345-678' >>> DB::select(DB::raw('COUNT(*)'))->from('admins')->where('telephone_number', '=', $form)->toSql();

同じくtinkerコマンドやddを使って、実際に発行されるSQLと比較すると良いかと思われます。
生SQLをどう変換するのが面倒な場合は生SQLをLaravel Builderに変換するツールがあるのでこちらを試すのもアリかなと思います。

http://www.midnightcowboycoder.com

投稿2017/12/22 03:32

編集2017/12/22 03:34
ucan-lab

総合スコア888

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

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

lkjgffh

2017/12/22 03:41

コメントありがとうございます。sql 上記のようにもかけるんですね 途中途中で確認できるtinkerの存在は知りませんでした。活用したいと思います!
guest

0

Rulesを使うなら
passesメソッドの中に書いてますよね。
そもそも、globalから直接値を取得するのはNGです。
passesの$valueから取得しましょう。

また、TELの存在確認をしたいのだと思うのですが直接DBクラスを使うのではなくEloquentを利用したほうがいいです。

php

1public function passes(array $attribute, string $value) : bool 2 { 3 $confirmationTelNum = Admin::query()->where("telephone_number",$value)->count(); 4 .... 5 }

また、書いたSQLを確認する方法は

php

1Admin::query()->where("telephone_number",$value)->toSql();

で取得できます。
最後にtoSql()を付ける形です。
また、sqlを確認するのに便利なLaravel debugberというのもあるのでこちらを使ってみるのも良いかと。

投稿2017/12/22 03:25

y_nishizawa

総合スコア154

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

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

lkjgffh

2017/12/22 03:39

素人すぎて$valueを使うと言う発想がありませんでした。ご指摘ありがとうございます toSql()利用して見ます
guest

0

多分*が文字列になっていないからです。->count('*')に直してください。

投稿2017/12/22 03:25

masaya_ohashi

総合スコア9206

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

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

lkjgffh

2017/12/22 03:28

そうだったんですね。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問