質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

CakePHPのSearchプラグインで検索機能を実装したいが、検索条件を入力しても絞り込みできない

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,013

score 10

 環境

サーバー:AWS(Amazon Linux)
PHPバージョン:5.4.28
フレームワーク:CakePHP(v2.8)

 前提・実現したいこと

Searchプラグインを使って検索機能を実装したい。
ただしテーブル名とモデル名とでは名前が異なる。
(モデル名がTicket、テーブル名がQuestions)

 詳細

Questionsテーブルのtitleという列に対して部分一致検索をしたいと考えております。
以下のURLでアクセスされた際に、title列に"foo"という文字列が含まれるレコードを取得したいです。
https://example.com/tickets?title=foo

TicketのController/Model/Viewを新規に作成し、TicketモデルをQUESTIONSテーブルに紐付けられればと考えています。

 上記の実装をする理由

上記のURLの通りTicketという名前のモデルとして検索したいのですが、既存のシステムではこれをQuestionというモデルで実装しています。
DB上の物理テーブル名もQUESTIONSというテーブルに実装されており、今からQuestion→Ticketとモデル名を変更するのは工数の関係からも
不可能と見ています。

また既存のサイトにはすでに以下のURLがあり、今回作成する機能とは別の機能として存在します。
https://example.com/questions?title=foo

 発生している問題・エラーメッセージ

作成した検索フォームに"foo"と打ち込むと、以下のURLにリダイレクトされます。
https://example.com/tickets?title=foo

しかし検索結果には"foo"を含まないレコードも表示されます。
色々変更してみたのですが、どうしても解決方法が分かりません。

 該当のソースコード

<?php
App::uses('View', 'View');
class TicketsController extends AppController{

    public $uses = array("Question","Ticket");
    public $components = array("Paginator","Search.Prg");
    public $autoRender = true;
    public $layout = "main";
    public $presetVars = true;

    public function index(){
        /* ...全ページ共通の処理... */

        //検索条件をパース
        $this->Prg->commonProcess("Ticket");
        $condition = $this->Ticket->parseCriteria($this->Prg->parsedParams());

        //上記検索条件に「公開」の状態になっていることを追加
        $condition = array_merge($condition, array("open" => true));

        /* この時点の$conditionをdebug表示させると、GETパラメータが
         * ?title=fooとなっている場合でもarray("open"=>true)しか格納されていない
         * 従ってGETパラメータtitleが認識されていないのではないかと思われる。
         * 
         * しかし、$this->request->queryにはtitle=>fooが格納されている。
         */

        /* ... 以降、Ticketに固有の処理... */

        //ページネーションの設定
        $this->Paginator->settings = array(
            "limit" => 10,
            "order" => array("Question.created"=>"desc"),
            "conditions" => $condition,
            "paramType" => "querystring",
        );

        //画面に表示
        $this->set(array(
            "Tickets" => $this->Paginator->paginate("Question"),
            "me" => $me,
            "canonical_url" => LINE_BASE_URL."/tickets/",
            "queryparams" => $this->request->query,
        ));
    }
}
<?php
class Ticket extends AppModel{
  public $name = "Question";
  public $actsAs = array('Search.Searchable');

  public $filterArgs = array(
    "title" => array(
      "type"=>"like",
      "field"=>array("Question.title"),
    ),
  );
}
<!-- フォーム部分を抜粋 -->
<div class="search">
  <?= $this->Form->create("POST", array("url"=>"index")) ?>
  <table>
    <tr>
      <th>チケット名で検索</th>
      <td><?= $this->Form->input("Ticket.title", array("label"=>false, "div"=>false)) ?></td>
    </tr>
  </table>
  <?= $this->Form->end("検索") ?>
</div>

<!-- ページネーション部分を抜粋 -->
<div class="pagenation">
  <?php
    $this->paginator->options(array(
      "url" => array(
        "?" => $queryparams   // 設定しないとページ遷移した時に検索条件がなくなる
      )
    ));
  ?>
  <?= $this->paginator->numbers(array(
    "first" => 1,             // 「最初のページへ戻る」のリンクの数
    "last" => 1,              // 「最後のページへ行く」のリンクの数
    "ellipsis" => " ... ",    // 省略していることを表すための文字列
    "separator" => " | ",     // ページングリンクを分割する際に表示されるもの
    "modulus" => 5,           // ページングとして表示する数
    "tag" => "",              // リンクを囲むタグ
  )); ?>
</div>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • CakePHPのSearchプラグインで検索機能を実装したいが、検索条件を入力しても絞り込みできない