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

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

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

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

Laravel 5

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

Q&A

解決済

2回答

7344閲覧

Laravelでひらがなカタカナ区別せず検索できるようにしたい

lkjgffh

総合スコア37

MySQL

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

Laravel 5

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

0グッド

2クリップ

投稿2018/03/12 07:04

前提・実現したいこと

登録されているユーザーの読み仮名(カタカナ)を検索する際、検索フォームからひらがなを入れても検索できるようにしたい

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

"Type error: Argument 1 passed to Illuminate\Database\Connection::prepareBindings() must be of the type array, string given, called in /home/vagrant/code/アプリ名/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 665 ◀"

該当のソースコード

$Users = DB::select('SELECT * FROM users WHERE name_kana LIKE _utf8mb4', "%$name%", 'COLLATE utf8mb4_unicode_ci');

試したこと

Mysqlでじかにsqlをたたいて書きたいsqlを確認しました
Mysqlで成功したクエリがこちらになります

SELECT * FROM users WHERE name_kana LIKE _utf8mb4'%やまだ%' COLLATE utf8mb4_unicode_ci

Laravelのクエリを下記のように書き換えてみましたがこちらもだめでした

$Users = DB::select('SELECT * FROM users WHERE name_kana LIKE _utf8mb4 ? COLLATE utf8mb4_unicode_ci', ["%$name%"]);

エラー

"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 '? COLLATE utf8mb4_unicode_ci' at line 1 (SQL: SELECT * FROM users WHERE name_kana LIKE _utf8mb4 %やまだ% COLLATE utf8mb4_unicode_ci) ◀"

シングルコーテーションがつくようにすればよいのかと思い下記のようにもしてみました
結果こちらです

$Users = DB::select('SELECT *FROM users WHERE name_kana LIKE _utf8mb4', '?', 'COLLATE utf8mb4_unicode_ci', ["%$name%"]);
"Type error: Argument 1 passed to Illuminate\Database\Connection::prepareBindings() must be of the type array, string given, called in /home/vagrant/code/アプリ名/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 665 ◀"

Laravelでひらがなでもカタカナでもどちらでも検索できるようにするにはどのようにしたらよいでしょうか?

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

Laravel5.5
Mysql
php 7

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

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

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

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

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

guest

回答2

0

以下試してみて下さい

SQL

1create table tbl( 2val1 varchar(30) character set utf8 collate utf8_general_ci, 3val2 varchar(30) character set utf8 collate utf8_unicode_ci 4); 5 6insert into tbl values 7('ハハハ','ハハハ'), 8('バババ','バババ'), 9('ははは','ははは'), 10('ばばば','ばばば'), 11('ぱぱぱ','ぱぱぱ'), 12('ハハハ','ハハハ'), 13('バババ','バババ'), 14('パパパ','パパパ'); 15

utf8_general_ci

generalの場合文字のゆらぎを許さないので完全に合致するものだけ表示されます

SQL

1select * from tbl where val1 like 'は%'; 2//「ははは」のみ 3 4select * from tbl where val1 like 'パ%'; 5//「パパパ」のみ 6 7select * from tbl where val1 like 'ハ%'; 8//「ハハハ」と「バババ」 9 10select * from tbl where val1 like 'バ%'; 11//「バババ」

utf8_unicode_ci

unicodeの場合文字のゆらぎを最大限吸収しようとします

SQL

1select * from tbl where val2 like 'は%'; 2//全部表示 3 4select * from tbl where val2 like 'パ%'; 5//全部表示 6 7select * from tbl where val2 like 'ハ%'; 8//全部表示 9 10select * from tbl where val2 like 'バ%'; 11//「バババ」のみ→これはしかたない

投稿2018/03/12 07:47

編集2018/03/12 07:50
yambejp

総合スコア114585

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

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

0

ベストアンサー

接続レベルでcollationを設定すれば可能なようです。

https://stackoverflow.com/questions/19514247/how-to-add-collate-to-laravel-query

投稿2018/03/12 07:17

naga3

総合スコア1293

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

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

lkjgffh

2018/03/12 07:41

上記のURL先に書かれていることはconfig/database.phpに新たにコネクションを書き足すということでしょうか? config/database.phpに 'mysql-collation' => array( 'driver' => 'mysql', 繋ぎたいDBの各種設定 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), として $users = DB::connection('mysql-collation') ->select('name_kana','user_name') ->where('name_kana','like', "%$name%") ->toSql(); dd($users); としたのですが下記のエラーが引き続き出ます。 config/database.phpへ追記すると思ったのですが別の場所なのでしょうか? "Type error: Argument 1 passed to Illuminate\Database\Connection::prepareBindings() must be of the type array, string given, called in /home/vagrant/code/アプリ名/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 665 ◀"
naga3

2018/03/12 09:06 編集

config/database.phpにおいて、'mysql-collation'の設定は'mysql'の直後あたりに書いていますか? あと、一度以下のようなシンプルなSQLでエラーが出るかどうか試してみてください。 $users = DB::connection('mysql-collation')->select('select * from users'); dd($users);
lkjgffh

2018/03/12 09:33

>config/database.phpにおいて、'mysql-collation'の設定は'mysql'の直後あたりに書いていますか? はい、直後に書いています >$users = DB::connection('mysql-collation')->select('select * from users'); であれば実行してもエラーは出ませんでした。登録されているユーザー全てが出力される状態です
lkjgffh

2018/03/13 01:02

何度もコメントくださってありがとうございます おっしゃるとおり文法に問題がありました。下記サイトを元に https://stackoverflow.com/questions/40891099/call-to-a-member-function-where-on-array-laravel-5-0-35 $user_check = collect(DB::table('users') ->whereRaw('replace(user_name, " ", "") = ?', [$user_name]) ->get()); としたところ、DB側・リクエスト側双方の空白を無視して検索できるようになりました。 本当に助かりました、ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問