LIKE를 사용하여 결과 필터링


16

다음 세 가지 "헤이 스택"문자열을 고려하십시오.

ㅏ) foo bar

비) welcome to foo bar industries

씨) 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
));

배열의 배열로 두 번째 매개 변수를 전달하면 다음을 사용하여 조건이 연결됩니다. OR


그 작동 :) 배열 트릭에 대해 몰랐습니다. 감사합니다.
beingalex

사용자 정의 / 비 eav 모델에서는 addAttributeToFilter로 교체해야합니다 addFieldToFilter.
jvalanen

어떤 배열이 결과를 반환했는지 확인하는 방법이 있습니까? 이 방법을 사용하여 사용자 정의 모델 컬렉션 (name, description, alternate_name 필드)을 검색하고 설명 (검색 결과에 추가 UI 요소 포함)으로 인해 결과가 발생했는지 알고 싶습니다.
pspahn

3
@pspahn 간단하지 않습니다. 선택이 실행 된 후 결과를 반복하고 원하는 필드에서 바늘이 있는지 확인할 수 있습니다.
Marius

9

가능한 해결책은 다음 REGEXP대신 사용하는 것입니다 LIKE.

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

로부터 MySQL의 문서 :

[[: <:]], [[:> :]]

이 마커는 단어 경계를 나타냅니다. 단어의 시작과 끝을 각각 일치시킵니다. 단어는 단어 문자가 앞에 오거나 뒤에 오지 않는 일련의 단어 문자입니다. 단어 문자는 alnum 클래스 또는 밑줄 (_)의 영숫자 문자입니다.

$needlePOSIX 정규식에서 특별한 의미가있는 문자를 포함 할 수 있으면 이스케이프해야합니다. 참조 : https : //.com/questions/4024188/php-function-to-escape-mysql-regexp-syntax


3

수락 된 답변이 제대로 작동하지 않습니다. 텍스트 전후 공간 만 확인합니다.

다음 목록이 있다고 가정하십시오.

  • 재킷
  • 여름 자켓
  • 겨울 자켓

이제 허용 된 답변을 사용하여 재킷 을 검색하려고하면 Summer JacketWinter Jacket 만 반환됩니다.

다음 해결책이 더 낫다고 생각합니다.

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

문제의 사례 (c)는 포함하지 않습니다 (즉, "재킷"과도 일치). 대신, ['eq' => $needle]정확히 일치하는 항목을 찾기 위해 네 번째 조건 을 추가 할 수 있습니다 (또는 공백뿐만 아니라 모든 경계를 찾는 정규식 솔루션 사용)
Fabian Schmengler

위의 코드는 정확히 일치하는 것을 찾을 수 있습니다. 나는 그것을 확인
Dinesh Yadav

나는 의심하지 않았다. 그러나 더 많은 것을 찾으면 안됩니다. 최소한 원래 질문과 동일한 요구 사항이있는 경우 : "foo bar"를 검색 할 때 "foo barer"를 찾지 마십시오
Fabian Schmengler

그래 당신 말이 맞아요. 수락 된 답변이 제대로 작동하지 않아서 비슷한 항목을 얻는 간단한 한 줄 필터를 제안했습니다.
Dinesh Yadav
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.