検索機能の作り方

  • 2021.10.17
  • PHP
検索機能の作り方

検索の基本的な流れ

HTMlのフォームより、特定の文字が入力され、それらを裏側にて受け取りを行う。
受け取った値を特定のテーブルのwhere句に入れてSQLの条件検索を行い、検索を行う。

流れ

view側での流れ

①HTMLのinputを作成し、nameに配列形式で入れる
※例えば:search[free]など

<input type=”text” class=”form-control” placeholder=”フリー検索” name=”search[free]” value='<?php echo $search_freer; ?>’>

②検索・クリアに配列ではない、単体のnameをセット
※例えば:search_typeなど

コントローラー側での流れ

①クリアを押された場合は、配列の中身をクリアにする(配列の初期化)

//検索クリア
if (isset($_POST[‘search_type’]) && $_POST[‘search_type’] == ‘クリア’) {
$_POST[‘search’] = array();
}

②POSTにて受け取り

//POSTデータ取得
$search_free = isset($_POST[‘search’][‘free’]) ? htmlspecialchars($_POST[‘search’][‘free’]) : ”;

テーブル結合

③今回は、顧客DBと代理店DBの二つのDBを結合して、フリー検索を行います。
以下の内容の解説:
1 coustomerデータベースを指定します。
2 customerデータベース名をtable_aliasにて「t1」に名前変更する
3 t1のカラムを全件表示をしたいのでアスタリスク(*)指定をします。
4 left_outer_joinにて「left外部結合」を行います。
5 partnerデータベースを指定をし、t2に名前変更する
6 t1の”customer_partner_code”とt2のidを比較し、条件に一致する値を取得

※left_outer_joinは、一致しないデータは空で入る

$sql = ORM::for_table(‘customer’)->table_alias(‘t1’)->select(‘t1.*’)->select(‘t2.partner_name’, ‘join_partner_name’)->left_outer_join(‘partner’, array(‘t1.customer_partner_code’, ‘=’, ‘t2.id’), ‘t2’);

あいまい検索

処理の解説:
1 if文にてフリー検索があるかを判定
2 ある場合は、以下の処理を実行
3 where_any_isは、複数のorをするときに使用
※各内容をarrayで囲む
4 ”%$search_free%”で指定をしている場所は、プレースホルダーとなる
5 ’customer_status’ => ‘LIKE’,であいまい検索を行う。
その際に、左辺の部分は検索をかけたいカラム名を指定、ここで値をセットするようになる。

if ($search_free != “”) {
$sql->where_any_is(
array(
array(‘customer_status’ => “%$search_free%”),
array(‘t2.partner_name’ => “%$search_free%”),
array(‘customer_contract_start_date’ => “%$search_free%”)
),array(‘customer_status’ => ‘LIKE’, ‘t2.partner_name’ => ‘LIKE’, ‘customer_contract_start_date’ => ‘LIKE’)

AND検索

下記の内容のポイントは、if文で検索対象があるかを判定して、あればwhereにて、実行する

if ($search_status != “”) {
$sql->where(‘customer_status’, (int)$search_status);
}
if ($search_partner != “”) {
$sql->where_like(‘t2.partner_name’, “%$search_partner%”);
}
if ($search_contract_start != “”) {
$sql->where_gte(‘customer_contract_start_date’, “$search_contract_start”);
}
if ($search_contract_end != “”) {
$sql->where_lte(‘customer_contract_start_date’, “$search_contract_end”);
}

検索の処理まとめ

/******************************
* 検索一覧
******************************/
$sql = ORM::for_table(‘customer’)->table_alias(‘t1’)->select(‘t1.*’)->select(‘t2.partner_name’, ‘join_partner_name’)->left_outer_join(‘partner’, array(‘t1.customer_partner_code’, ‘=’, ‘t2.id’), ‘t2’);
if ($search_free != “”) {
$sql->where_any_is(
array(
array(‘customer_status’ => “%$search_free%”),
array(‘t2.partner_name’ => “%$search_free%”),
array(‘customer_contract_start_date’ => “%$search_free%”)
),array(‘customer_status’ => ‘LIKE’, ‘t2.partner_name’ => ‘LIKE’, ‘customer_contract_start_date’ => ‘LIKE’)
);
}
if ($search_status != “”) {
$sql->where(‘customer_status’, (int)$search_status);
}
if ($search_partner != “”) {
$sql->where_like(‘t2.partner_name’, “%$search_partner%”);
}
if ($search_contract_start != “”) {
$sql->where_gte(‘customer_contract_start_date’, “$search_contract_start”);
}
if ($search_contract_end != “”) {
$sql->where_lte(‘customer_contract_start_date’, “$search_contract_end”);
}
$customer_ListObj = $sql->order_by_desc(‘id’)->find_array();