連投ですが今回もお付き合いお願い致します!
例えばこんなかんじのテーブルがあったとします。
id | type |
1 | 1,3,10 |
2 | 5,21 |
3 | 2,7,8,10 |
typeというフィールドの中身は、カンマで複数の値を区切って保存されています。
こういう使い方が正解なのか分からないのですが、アンケートの自由選択欄とかを作るときなんかに私はこういうやり方をしています。
何十個もあるなかから自由に数点選ぶ方式だと、フィールドをその何十個分用意するより楽なので…
で、このフィールドtypeを元に検索をしたいなあとなったとき。たとえば5番が含まれているデータだけが欲しいなとなったら「FIND_IN_SET」というのがSQLにはあるので、それを使いたいのですが、CakePHPで再現する方法が公式ドキュメントで見つけられず……
debugモードで発行されるSQLを確認しながら編み出したのが以下の書き方です。
$this->モデル->find('all',array('conditions' => array('FIND_IN_SET(\''. 検索値 .'\',カラム名)')))->all();
$this->モデル->find('all', ['conditions' => ['FIND_IN_SET(\''. 検索値 .'\',カラム名)']])->all();
以上いずれかです。
配列の表現方法が、「array()」と「[]」のどちらを使うかの違いだけなので、普段やっている書き方に合わせれば大丈夫です。
検索条件を
$this->モデル->find()->where(['モデル.type IN' => 検索値])->all();
とかで書いてしまうと、検索値が「1」になったとき「10を含むデータ」「21を含むデータ」も取ってきそうな予感だったので、無事にFIND_IN_SETが発動する形をつくることができてよかったです。
The following two tabs change content below.
金子風月
犬と歯車がついたものと跨り移動系スポーツ(馬・自転車)が好きな駆け出しweb系エンジニア。
2018年2月より、株式会社凛の皆様のおかげで憧れのweb系エンジニアになることができました。
最新記事 by 金子風月 (全て見る)
- vue.jsに触ってみた話 - 2019年3月26日
- DockerでCakePHP2の開発環境を作ってみた(Mac版) - 2019年3月15日
- CakePHP3+Authコンポーネントで任意のタイミングでログインさせる処理をつくる - 2019年3月14日
風月さーーーーん!!!ありがとうございます!!!!
まさに今の案件で、カンマ区切りの値を検索、やってました!!
すでに実装したところは、「カンマ+検索値」もしくは「検索値+カンマ」もしくは「検索値」が一致した場合、みたいな面倒な実装をしていましたが、このほうほうのほうがスマートですね!
というわけで、たった今、この実装をしました!!
良い情報をありがとうございます!!!
お役に立てたようで良かったです!
SQLの書き方は分かってるのにcakePHPのクエリビルダーでどうやるかは分からない、ってこと結構ありますよね……
また珍しいクエリの作り方を見つけたら投稿させて頂きます!