CakePHP 検索機能(friendsofcake/search)
インストール
composer require friendsofcake/search
設定
cd bin
cake plugin load Search
※~/config/bootstrap.php
Plugin::load('Search');
完全一致検索
ビュー
<form method="post" accept-charset="utf-8" action="~">
<div><?= $this->Form->text('name') ?></div>
<input type='submit' value='検索' />
<?= $this->Form->end() ?>
モデル
※~Table
public function initialize(array $config)
{
parent::initialize($config);
$this->addBehavior('Search.Search');
$this->searchManager()
->value('name');
}
コントローラ
※~Controller
public function initialize()
{
parent::initialize();
$this->loadComponent('Search.Prg', [
'actions' => ['(アクション名)']
]);
}
public function (アクション名)(){
$query = $this->(モデル名)
->find('search', ['search'=>$this->request->query]);
$this->set('(変数名)', $this->paginate($query));
}
あいまい検索
ビュー
<form method="post" accept-charset="utf-8" action="~">
<div><?= $this->Form->text('name') ?></div>
<input type='submit' value='検索' />
<?= $this->Form->end() ?>
モデル
※~Table
public function initialize(array $config)
{
parent::initialize($config);
$this->addBehavior('Search.Search');
$this->searchManager()
->like('name',[
'before' => true,
'after' => true
]);
}
複数カラム検索
ビュー
<form method="post" accept-charset="utf-8" action="~">
<div><?= $this->Form->text('name1') ?></div>
<div><?= $this->Form->text('name2') ?></div>
<div><?= $this->Form->text('name3') ?></div>
<input type='submit' value='検索' />
<?= $this->Form->end() ?>
モデル
※~Table
public function initialize(array $config)
{
parent::initialize($config);
$this->addBehavior('Search.Search');
$this->searchManager()
->add('name1',
'Search.Like', [
'before' => true,
'after' => true,
'mode' => 'or',
'comparison' => 'LIKE',
'wildcardAny' => '*',
'wildcardOne' => '?',
'field' => ['name1', 'name2', 'name3']
])
}
日付範囲検索
ビュー
<form method="post" accept-charset="utf-8" action="~">
<?= $this->Form->control('start_created', [
'type'=>'text',
'label'=>'開始',
'id'=>'date_start']); ?>
<?= $this->Form->control('end_created', [
'type'=>'text',
'label'=>'終了',
'id'=>'date_end']); ?>
jQuery処理
<?= $this->Html->scriptStart(['block' => true]) ?>
$( function() {
$( "#date_start" ).datepicker({
dateFormat: 'yy-mm-dd'
});
$( "#date_end" ).datepicker({
dateFormat: 'yy-mm-dd'
});
} );
<?= $this->Html->scriptEnd() ?>
<input type='submit' value='検索' />
<?= $this->Form->end() ?>
モデル
※~Table
public function initialize(array $config)
{
parent::initialize($config);
$this->addBehavior('Search.Search');
$this->searchManager()
->callback('start_created', [
'callback' => function ($query, $args, $filter) {
if(empty($args['end_created'])) {
return;
}
return $query->where(function ($exp) use ($args) {
時間の最小/最大を付与
$args['start_created'] .= ' 00:00:00';
$args['end_created'] .= ' 23:59:59';
return $exp->between(
'products.created',
$args['start_created'],
$args['end_created']
);
});
}
])
->callback('end_created', [
'callback' => function ($query, $args, $filter) {}
])
}
別モデル検索
モデル
※~Table
public function initialize(array $config)
{
parent::initialize($config);
$this->addBehavior('Search.Search');
$this->searchManager()
他の検索と組み合わせ可
->like('col',[
'before' => true,
'after' => true,
'field' => $this->aliasField('others.col')
])
}
コントローラ
※~Controller
public function initialize()
{
parent::initialize();
$this->loadComponent('Search.Prg', [
'actions' => ['(アクション名)']
]);
}
public function (アクション名)(){
$query = $this->(モデル名)
->find('search', ['search'=>$this->request->query]);
->contain(['others'])
$this->set('(変数名)', $this->paginate($query));
}