エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない

      2024/08/10

CakePHP4で数値項目のlike句の部分一致検索はできない

 
CakePHPの数値項目に対しては、下記のように like句を使用した select文は実行できないようです。
SELECT * FROM users WHERE income like '%100%';
 
 

CakePHP4で数値項目のlike句の部分一致検索はできないことの実例

 

like句の部分一致検索用のサンプルテーブル

 
下記のようなテーブルがあったとします。
 

 
このテーブルに対して、CakePHPのクリエビルダーを使用して、「name(varchar型)」と「income(int型)」に対して「like 句」を使用してレコード検索をしてみました。
 
 

「name(varchar型)」に対する like句の部分一致検索は問題ない

 
「name」のように文字型の場合は下記の記述方法で何も問題は発生しません。
「%」を囲む文字は「’(シングルクォート)」で囲っても、「”(ダブルクォート)」で囲っても問題はありません。
 

 
 

「income(int型)」に対する like句の部分一致検索はエラーが発生する

 
対して、数値項目である「income」に対して「%」ワイルドカードを使用した部分一致検索をしようとするとエラーになります。
 

 
上記を実行すると
「Cannot convert value of type string to integer」
というエラーが出ます。
 
「『income』は数値項目だけど、検索対象の文字列『%100%』は数値に変換できませんよ」というエラーです。
 
そんなエラーですので、「%」を囲む文字を「’(シングルクォート)」「”(ダブルクォート)」のどちらにしても同じエラーが出ます。
 
 

(バッククォート)」を使用するとエラーは出ないが部分一致検索はできていない

 
ちなみに、
下記のように「
(バッククォート)」を使用すると、エラーは出なくなりますが、「%」が機能しなくなり、完全一致でないと対象レコードを取得できなくなります。
 

 
この「`(バッククォート)」で囲むと「%」が機能しなくなるのは、「income(int型)」だけでなく、「name(varchar型)」でも同様でした。
 
 
ちなみに、「like」演算子を使っていてもワイルドカードを使用しない下記のような記述方法であればエラーは発生しません。
当然ですね。入力された値を数値として処理できますので。
 

 
ただ、ワイルドカードを使えないのであれば like検索をする必要性がないわけですが...
 
 

「income(int型)」に対する「_」を使用するパターンマッチングもエラーが発生する

 
like句での検索には、「_(アンダースコア、アンダーバー)」を使用したパターンマッチングもあります。
select * from users where income like "100_100";
 
「income(int型)」の項目に対しては、「_(アンダースコア、アンダーバー)」を利用したパターンマッチングもエラーが発生します。
 

 
 
「%」を使用した部分一致検索と同様に
「Cannot convert value of type string to integer」
というエラーです。
 
「_(アンダースコア)」は数値に変換できませんので、まぁ、同じエラーが出るだろうな、ということは予想できることですね。
 
 
※「name(varchar型)」の方は「_(アンダースコア)」を使用したパターンマッチングも問題なく実行できます。
 
 

「income(int型)」に対する部分一致検索の問題は SQLクリエービルダーの問題

 
今回紹介した CakePHP4において、数値型カラムに対して like句を使用した部分一致検索で発生するエラーの問題は、CakePHPの SQLのクリエービルダーの不具合によるもののようです。
 
下記のようにクリエビルダーを使わずに直接 SQLを実行する方法ではエラーは発生せず、想定したレコードが取得でることからも判断できます。
 

 
 
数値項目を like句を使用した部分一致検索をする場面は多くないと思いますが、どうしても「数値項目を部分一致検索したい!」という場合は上記のようにクリエビルダーを使用せずに直接 SQLを記述する方法が検討に入るのではないか、と思います。
 
その他の方法としては、int型をやめて varchar型にする、などでしょうか...
 
もし、こうすれば出来るよ、と言う方法があればご教授ください!
 
 
今回の参考サイトは下記になります。
 
CakePHP4 クリエービルダー
https://book.cakephp.org/4/ja/orm/query-builder.html
 
「シングルクォート」「ダブルクォート」「バッククォート」の違いについては、下記の記事などが参考になるかと思います。
記事自体は Linuxのコマンドに関する記事ですが、PHPでも基本的な扱いは同じです。
https://www.server-memo.net/shellscript/quart.html
 
 

CakePHP4の関連記事

CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法

CakePHP3でデフォルトのソート条件を設定しつつ画面上でユーザがソート条件を選択したときもソート処理を実行させる方法を解説。ソート条件はページネーションの処理として実装。

CakePHP4のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP4のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)

CakePHP4の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。

CakePHP3でCookieを保存、呼び出し、削除の操作・CakePHP3.7対応
CakePHP3でCookieを保存、呼び出し、削除の操作・CakePHP3.7対応

CakePHP3.7でCookieを保存、取り出し、削除する方法を解説。CakePHP3でのCookieの取り扱いはバージョンごとに変更されるため、環境に合わせた方法を探す必要がある。

CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説

CakePHP3でOGPを設定する方法を解説。fetch、assignを使用しレイアウトファイルに編集した変数にテンプレートファイルから値を指定する。これを利用してOGPを編集する。

CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合

CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。

VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する。
VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する

VirtualBoxにCentOS、Apache、MySQL、PHPをインストールするところから初めてCakePHP3の開発環境を構築する手順を詳細解説。この記事1つで全ての設定が完了する。

CakePHP 2.3 ログイン、操作履歴、アクセスログ出力

CakePHPでログインや操作履歴などのアクセスログ出力処理を作成します。

CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説

CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。

CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。Usersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。

CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)

CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。