CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
Search Pluginで検索処理 設置方法 その8
検索Plugin CakeDC/Searchの関連記事、および、CakePHP3に関連する記事
ここしばらくは CakePHP3の記事を書いていましたが、CakePHP2で開発をしたシステムのメンテナンス、機能拡張の案件も多く、今回の記事はそんな CakePHP2で開発した案件に関しての記事です。
CakePHP2の検索プラグイン「CakeDC/Search」を使った処理で、重複レコードを省く group by句(distinct句)の使い方について解説します。
CakePHP2の「CakeDC/Search」に関連する記事は、下記に書いていますので、あわせて参考にしてください。
CakePHP 2.3 Search Pluginで検索処理 その1設置方法
CakePHP 2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法
CakePHP 2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHP 2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHP 2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索
また、CakePHP3に関する記事は、以下に一覧ページがあります。
「CakePHP3」に関する記事一覧(https://blog.s-giken.net/tag/cakephp3)
検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)を実装
検索Plugin CakeDC/Searchの基本的な使い方については、先にも書いていますが、に記事を書いていますので、その記事を参考にしてください。
基本的な使い方が分かっている前提で解説を行っていきます。
また、テーブルの設定なども「CakePHP 2.3 Search Pluginで検索処理 その1設置方法」の記事をベースに解説しています。
検索Plugin CakeDC/Searchを使う場合でも、重複を省く group by(distinct)を実装する場所は、CakeDC/Searchの中ではなく、下記のサンプルソースの 36行目に書いていますが、paginatorの処理の中に設定します。
そのため、group by(distinct)の実装方法は、「CakeDC/Search」プラグインを使う場合でも、find()関数を使う場合でも変わらない、ということになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php class UsersController extends AppController { public $name = 'Users'; public $uses = array('User', 'Profile'); public $components = array('Search.Prg'); public $presetVars = array(); public function beforeFilter() { // 検索対象のフィールド設定代入 $this->presetVars = $this->User->presetVars; // ページャ設定 $pager_numbers = array( 'before' => ' - ', 'after'=>' - ', 'modulus'=> 10, 'separator'=> ' ', 'class'=>'pagenumbers' ); $this->set('pager_numbers', $pager_numbers); } public function index() { // 検索条件設定 $this->Prg->commonProcess(); // 検索条件取得 $conditions = $this->User->parseCriteria($this->passedArgs); $this->paginate = array( 'conditions' => $conditions, 'limit' => 3, 'group' => array ( 'username' ), ); $this->set('users', $this->paginate('User')); } } |
Modelは特に変更するところがないので「CakePHP 2.3 Search Pluginで検索処理 その1設置方法」のソースのコピペです。
(/app/Model/User.php)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php class User extends AppModel { public $name = 'User'; // 検索プラグイン public $actsAs = array('Search.Searchable'); // 検索対象のフィルタ設定 public $filterArgs = array( array('name' => 'id', 'type' => 'value', 'field' => 'User.id'), array('name' => 'username', 'type' => 'like', 'field' => 'User.username'), array('name' => 'nickname', 'type' => 'like', 'field' => 'Profile.nickname'), ); // 検索対象のフィールド設定 public $presetVars = array( array('field' => 'id', 'type' => 'value'), array('field' => 'username', 'type' => 'value'), array('field' => 'nickname', 'type' => 'value'), ); // アソシエーション public $hasOne = array( 'Profile' => array( 'className' => 'Profile', 'foreignKey' => 'user_id', 'conditions' => null, 'fields' => null, 'dependent' => true, ), ); } |
重複を省く場合でも group byを。distinctは使わない
重複を省く処理は、CakePHPでは「group by」を使うことを想定しているようです。
(CakePHP 2.x) 重複を取り除いた場合のPaginateのページ数
http://www.tailtension.com/cakephp/1116/
重複行のまとめ方はGROUP BY?DISTINCT?
https://qiita.com/tori076/items/ef7ac4301f9c20491bae
これらの記事を読むと、MySQLでは「distinct」より「group by」の方が早いようです。
もしかすると、CakePHPを作っている方々は、この状況を知っていて、CakePHPでは「distinct」は要らない、「group by」を使えば事足りるじゃないか、という作りになっているのかもしれません。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法
CakePHP3でcomposerを使ってパッケージ(ライブラリ、プラグイン)をインストールする方法の解説。PHPを使うのはCakePHP3が初めてというような方への使い方から解説。
-
-
CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども
CakePHP3でHtmlHelperを使ってリンクの設定をする方法のまとめ。基本形からURLを指定、class、id、targetを指定、mailtoのリンク、画像をアンカーに、JavaScriptのダイアログなどの解説。
-
-
CakePHP 2.3でOn Duplicate Key構文を実装
CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。
-
-
CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説
CakePHP4でコマンドプログラムからコンポーネントを呼び出す方法を解説。コントローラーから呼び出すときと大差はないが、use句でコンポーネントを指定する事がポイント。
-
-
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。
-
-
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4でデフォルトのレイアウトファイル「default.php」は管理側に使用し、これとは別のデザインを公開側のページに設定したい、を実装する方法を解説。
-
-
CakePHP3で画像・ファイルのアップロード処理を自作・解説付き・その2
ファイルのアップロード機能の自作サンプルコードとその解説のその2。アップロード機能に関連するファイルの更新や削除の処理や画像、フォルダのパスの指定方法などを含めて解説。
-
-
CakePHP3のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法
CakePHP3でテーブルのアソシエーションしたデータの取得をコントローラー側でINNERかLEFTを指定する方法を解説。TableファイルにINNERで指定していてもController側で変更ができる。
-
-
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4でテンプレートやレイアウトファイルをデフォルトから変更する場合は「render()」を使用するが、記述場所はできるだけコントローラー内の最後の方に書く方がいい。
-
-
CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法
CakePHP3でテンプレートファイルやレイアウトファイルをデフォルトのものから別のものに変更したい場合の指定方法を解説。