LIKEを使用した結果のフィルタリング


16

次の3つの「haystack」文字列を考えてください。

a) foo bar

b) welcome to foo bar industries

c) foo barer

そして今、私の「針」:

foo bar

(ヘー)

フィルターを、干し草の山の文字列aとbに一致させますが、cは一致させません。私が試してみました:

$collection->addAttributeToFilter('name', array('like' => '%'.$needle.'%'));

しかし、上記はcと一致します。

私も試しました:

$collection->addAttributeToFilter('name', array('like' => '% '.$needle.' %')); // Note the spaces

上記はbとのみ一致します。

どんな助けも大歓迎です。

回答:


37

これを試して、適合するかどうかを確認してください。

$collection->addAttributeToFilter('name', array(
    array('like' => '% '.$needle.' %'), //spaces on each side
    array('like' => '% '.$needle), //space before and ends with $needle
    array('like' => $needle.' %') // starts with needle and space after
));

2番目のパラメーターを配列の配列として渡すと、次を使用して条件が連結されます。 OR


動作します:)配列のトリックについては知りませんでした、ありがとう。
beingalex

カスタム/非eavモデルaddAttributeToFilterはに置き換える必要がありaddFieldToFilterます。
-jvalanen

どの配列が結果を返したかを判断する方法はありますか?このメソッドを使用してカスタムモデルコレクション(name、description、alternate_nameフィールド)を検索していますが、説明が原因で結果がヒットしたかどうかを知りたい(検索結果に追加のUI要素を含めるため)。
pspahn

3
@pspahn単純なものではありません。選択を実行した後、結果をループして、必要なフィールドのいずれかに針が見つかったかどうかを確認できます。
マリウス

9

可能な解決策は、REGEXP代わりに使用することですLIKE

$collection->addAttributeToFilter('name', array('regexp' => '[[:<:]]'.$needle.'[[:>:]]'));

MySQLドキュメントから:

[[:<:]]、[[:>:]]

これらのマーカーは単語の境界を表しています。これらはそれぞれ単語の始まりと終わりに一致します。単語は、単語文字が前後にない単語文字のシーケンスです。単語文字は、alnumクラスの英数字またはアンダースコア(_)です。

$needlePOSIX正規表現で特別な意味を持つ文字を含めることができる場合、それらをエスケープする必要があることに注意してください。参照:https : //stackoverflow.com/questions/4024188/php-function-to-escape-mysql-regexp-syntax


3

受け入れられた答えは正しく機能しません。テキストの前後のスペースのみをチェックしています。

次のリストがあるとします

  • ジャケット
  • サマージャケット
  • 冬用ジャケット

受け入れられた答えを使用してジャケットで検索しようとすると、サマージャケットウィンタージャケットのみが返されます

次の解決策が良いと思います

$collection->addAttributeToFilter('name', array('like' => '%' . $needle. '%'));

質問のケース(c)はカバーしません(つまり、「ジャケット」にも一致します)。代わりに、第4の条件は、['eq' => $needle](スペースだけでなく、すべての境界を見つけた正規表現のソリューションを使用して、またはそれ以上)の正確な一致を検索するために追加することができます
ファビアンSchmengler

上記のコードは完全に一致するものを見つけることができます。私はそれを確認しました
ディネッシュ・

私はそれを疑いませんでした。しかし、それはもっと見つけますが、そうすべきではありません。少なくとも元の質問と同じ要件がある場合:「foo bar」を検索するときに「foo barer」を見つけないでください
ファビアン・シュメングラー

はい、あなたは正しいです。受け入れられた答えが適切に機能しなかったため、同様のアイテムを取得するための簡単な1行のフィルターを提案しました。
ディネシュヤダブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.