LIKE句がフッククエリの変更で機能しない


9

Drupal 7でデフォルトの検索をLIKE句に置き換えようとしています。既存のクエリへのOR条件の追加に従ってクエリを変更しようとしました

function MYMODULE_query_node_access_alter(QueryAlterableInterface $query) {
  foreach ($query->getTables() as $table) {
    // LIKE for search results.
    if ($table['table'] == 'search_index') {
      // Get the query args and then the search term
      $args =& $query->getArguments();
      $search = $args[':db_condition_placeholder_1'];

      // Get a reference to the existing query conditions.
      $conditions =& $query->conditions();

      // Save the former conditions
      $former_conditions = $conditions;

      // Reset the condition array. It needs a default #conjunction for which AND is fine
      $conditions = array('#conjunction' => array_shift($former_conditions));

      // Replace the search condition in the query
      foreach ($former_conditions as $key => $condition) {
        if ($key != 1) {
          $query->condition($condition['field'], $condition['value'], $condition['operator']);
        }
        else {
          $query->condition('i.word', '%' . db_like($search) . '%', 'LIKE');
        }
      }
    }
  }
}

「宣言」という単語で検索すると、デフォルトのdrupal検索と同じ結果が表示されますが、「decl」で検索しても結果は見つかりません。

コードが機能しない理由はありますか?


1
drupal.org/project/fuzzysearchモジュールは問題を解決するはずです。あなたは...それを試してみることができます
アニル・サーガル

ありがとうございました。検索フォームと結果ページがすでに設定されているため、私は(可能であれば)hook_query_alterを使用したソリューションを好みます。また、コードが他のユースケースで機能しない理由も知りたいです。
user9932

1
あなたはそこにいる道の90%であるように見えるかもしれませんが、それを機能させるためにこの最後の部分が必要なだけですが、私はあなたがそれを間違った方法で行っていると思います。あらゆる種類のユースケースに対応する検索モジュールがたくさんあり、あなたがあなたの問題を解決するものを見つけると私は確信しています。この種の介入を使用すると、混乱と保守性の低下につながる可能性があります。
アランディクソン

$search変数に含まれるものを印刷してみたことはありますか?$ search = $ args [':db_condition_placeholder_1']; それがビューからであるならば、それはhook_views_query_alter()簡単です。

回答:


0

使用しているフックを変更しようとしましたMYMODULE_query_alterか?

あなたはhook_query_TAG_alter()を実装していますが、検索クエリがどこにタグ付けされているのかわかりません。

ノードAPIごと:

これは、「node_access」でタグ付けされたクエリのhook_query_alter()です。これは、「アカウント」メタデータ(または指定されていない場合はグローバル$ user)によって指定されたユーザーアカウントのノードアクセスチェックを追加します。可能な値は「更新」および「削除」です。


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

これを使用して、タグ名をview->query設定します。これを使用すると、ビューを区別することもできます。


0

新しい条件を追加するには、add_whereで上記を試すこともできます

$query->add_where(1,'i.word', '%' . db_like($search) . '%', 'LIKE');

これがあなたが探している結果をもたらすことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.