連投ですが今回もお付き合いお願い致します!
例えばこんなかんじのテーブルがあったとします。

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系エンジニアになることができました。