DEVELOPERS BLOGデベロッパーズブログ
- HOME >
- 加藤 正人のデベロッパーズブログ >
- テキストフィールドを CSV として処理する CakePHP ビヘイビア・その2
加藤 正人のデベロッパーズブログ
- 氏名
- 加藤 正人
- 役職
- 多分SE
- 血液型
- 秘密
- 出没
- 美味しいもののあるところ
- 特色
- タヒチ大好き。ちょいメタボ。
- 2020/12/15
- CakePHP3 のリダイレクトがうまく行かない例
- 2020/11/12
- Apache Bench
- 2020/10/05
- PhpSpreadsheet でExcel ファイルを読み込む (CakePHP3)
今回もテキストフィールドを CSV として処理するビヘイビアの作成を進める。
前回の取得用コールバックに引き続き、今回は保存時のコールバックを作成する。
データ保存時の変換
データ保存時には、beforeSave() コールバックで保存データをチェックし、該当するフィールドのデータをカンマ区切り文字列に変換する。渡されたデーがが空配列や空文字列の場合は '' (空文字列) に変換する。
絞り込み条件の変換
最後に、find() 時の検索式の変換処理を beforeFind() コールバックで行なう。条件の変換は再帰処理になるので、プライベートメソッド __condition_replace() として独立させておく。
__condition_replace() の内部処理では、簡単のため条件配列のキーは {モデル名}.{フィールド名} のみ、値はスカラー値のみ (整数のみ) としており、!= や大小比較、IN 演算、あるいは MySQL 関数呼び出しには対応していない。
__condition_replace() では、CSV フィールドを検出すると、その {モデル名}.{フィールド名} => {値} の組を次の「OR」形式に変換する。
'OR' => array( "{モデル名}.{フィールド名} LIKE" => "{値}", // 値が単独値の場合 "{モデル名}.{フィールド名} LIKE" => "{値}{区切り文字}", // CSV形式の先頭にマッチ "{モデル名}.{フィールド名} LIKE" => "{区切り文字}{値}{区切り文字}", // CSV形式の途中にマッチ "{モデル名}.{フィールド名} LIKE" => "{区切り文字}{値}", // CSV形式の末尾にマッチ )
これにより、CSV フィールドに値が含まれるかどうかを文字列演算で行なうことができる。
この書き換えメソッドを beforeFind() コールバックで使用して条件配列を書き換える。実際のコードは下記のようになる。
以上で CSV フィールドへの対応が簡易的ではあるが可能となる。
2020/12/15
2020/11/12
2020/10/05
2020/09/11
2020/08/03