エス技研

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の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
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」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHP 2.3で saveの便利な使い方・サンプルソース付き

CakePHPのレコードを保存、更新する際に使う Saveを詳細解説します。

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

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

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

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

CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順

CakePHP3で「1対多」の連携を中間テーブルを利用した「多対多」の連携に変更するときの手順のまとめ。中間テーブルの設定やModelの変更などを間違いやすい箇所を指摘しながらの解説。

CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法

CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。

CakePHP3のCakeDC/Usersのログイン後のリダイレクトを設定解説
CakePHP3のCakeDC/Usersのログイン後のリダイレクトとユーザ権限管理の設定解説

CakeDC謹製Usersプラグインの紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。

CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で queryを使って日付の範囲検索の方法です。

CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法

CakePHP4系、5系のログイン認証の可否のチェック、および、ログインユーザの情報を取得する方法のまとめ。複数の方法があるが手続きが微妙に異なるためまとめてみた。

CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1
CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその1で基本的な導入方法の解説で読みながら簡単に導入が可能。

CakePHPで Auto Incrementを外すと Duplicate entry '0' for keyのエラーが出るかも
CakePHPで Auto Incrementを外すと Duplicate entry ‘0’ for keyのエラーが出るかも

CakePHPでAuto Incrementの設定を変更したときに「Duplicate entry ‘0’ for key」のエラーが出た。原因はModel内で IDを編集する処理の追加を忘れていたからだった。