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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Laravel 5

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

Q&A

2回答

4993閲覧

laravel5.5での曖昧検索のクエリのなかでの変数の扱い方がわからない

lkjgffh

総合スコア37

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Laravel 5

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

0グッド

0クリップ

投稿2018/02/08 09:24

前提・実現したいこと

Laravel5.5でフォームから入力された値を元にユーザーテーブルからユーザーを検索したい。
その際、漢字・カタカナのどちらでも検索でき、かつ半角・全角の空間を無視したい

発生している問題・エラーメッセージ

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.$name."%" or name_kana like "%".$name."%"' at line 1 (SQL: select `name_kana`, `user_name`, `birth_date` from `users` where user_name like "%".$name."%" or name_kana like "%".$name."%")

該当のソースコード

public function search(Request $request){ $name = $request->name; $name_search = DB::table('users') ->select('name_kana','user_name','birth_date') ->whereRaw('user_name like "%".$name."%" or name_kana like "%".$name."%"') ->get(); }

試したこと

現在変数になっているところを「"%ヤマダ%"」とした状態でtoSqlでクエリを出力し、Mysqlで直接実行したところきちんと欲しい結果が返ってきました

select `name_kana`, `user_name`, `birth_date` from `users` where user_name like "%ヤマダ%" or name_kana like "%ヤマダ%";

"%".$name."%"は
'%$name%'
'%'.$name.'%'
ではエラーが出たので現在の形に直しました。曖昧検索で使う%との併用を調べてみましたが、これ以外の書き方が分かりませんでした。ご存知のかたいらっしゃいましたらお教えいただけないでしょうか?よろしくお願いします

補足情報(FW/ツールのバージョンなど)

Lalravel5.5
Mysql mysql Ver 14.14 Distrib 5.7.20,
php 7

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

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

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

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

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

guest

回答2

0

toSql() 使えばSQLを確認できる。
おかしい時は確認すべき。

php

1$name_search = DB::table('users') 2 ->select('name_kana','user_name','birth_date') 3 ->whereRaw('user_name like "%".$name."%" or name_kana like "%".$name."%"') 4 ->toSql(); 5dd($name_search);

php

1$name_search = DB::table('users') 2 ->select('name_kana','user_name','birth_date') 3 ->where(function($query){ 4 $query->where('user_name', 'like', "%" . $name . "%") 5 ->orWhere('name_kana', 'like', "%" . $name . "%"); 6 }) 7 ->get();

投稿2019/03/13 15:23

編集2019/03/13 15:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

こんな感じでやるんでしょうか

PHP

1whereRaw("user_name like concat('%',?,'%') or name_kana like concat('%',?,'%')",[$name,$name]) 2/*もしくは*/ 3whereRaw("user_name like ? or name_kana like ?",["%".$name."%","%".$name."%"]) 4

イメージ的には名前付きプレースホルダは使いまわせそうな感じがしますが

PHP

1whereRaw("user_name like :name or name_kana like :name",["name"=>"%".$name."%"])

実際、この使い方は動的プレースホルダでしか動作せず、そして動的プレースホルダは
インジェクション対策としては不十分とされるので、この方法は難しいかもしれません

投稿2018/02/09 00:57

yambejp

総合スコア114769

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問