0

すべてのフィールドがオプションである検索を実装しようとしているので、ユーザー入力に基づいて結果をフィルタリングする必要がありますが、これを実現する方法に固執しています...

検索フィールドは次のとおりです。

1)電子メールによる調査:

2)名前による検索:

3)登録日による調査:(つまり、fromDateとtoDate)

オプション1)および3)は、AND条件のみが必要であるため達成できます。

問題はオプション2にあります)名前はfirst_nameまたはlast_nameのいずれかに一致する必要があるため、OR条件が必要です。これを行う正しい方法がわかりません。

注:すべてのフィールドはオプションです...

これが私のコードスニペットです。

$conditions = array();

if(!empty($this->request->data['searchbyemail'])) {

   $conditions[] = array('User.username' => $this->request->data['searchbyemail']);
}

if(!empty($this->request->data['regfromdate']) &&
   !empty($this->request->data['regtodate'])) {

    $conditions[] = array('User.created BETWEEN ? AND ?' => 
    array($this->request->data['regfromdate'], $this->request->data['regtodate']));
}

if(!empty($this->request->data['searchbyname'])) {

    $conditions[] = array(
'OR' => array(
        'User.first_name' => $this->request->data['searchbyname'],
        'User.last_name' => $this->request->data['searchbyname']

                ));
}


$this->paginate = array('conditions' => $conditions);
$this->set('users', $this->paginate());

達成しようとしているクエリは次のようになります

SELECT * FROM  `users` AS `User`
WHERE `User`.`username` = 'a'
AND `User`.`created`
BETWEEN '2013-02-01'
AND '2013-02-05'
AND ((`User`.`first_name` LIKE '%b%')) OR ((`User`.`last_name` LIKE '%b%'))

このクエリはcakephpで生成できますが、静的です。検索フィールドはオプションであり、クエリはユーザー入力に応じて変更される必要があるため、このクエリを生成する動的な方法を探しています。

4

1 に答える 1

3

LIKE%ワイルドカードで演算子を使用するには、次のようにします。

        'OR' => array(
            'User.first_name LIKE' => "%" . $this->request->data['searchbyname'] . "%",
            'User.last_name LIKE' => "%" . $this->request->data['searchbyname'] . "%"
        ),
于 2013-02-05T05:33:10.663 に答える