LIKE का उपयोग करके फ़िल्टरिंग परिणाम


16

इन तीन "बाधा" तार पर विचार करें:

ए) foo bar

ख) welcome to foo bar industries

सी) foo barer

और अब मेरी "सुई":

foo bar

(हे)

मैं चाहूंगा कि मेरा फिल्टर मेरे सुई को मैच से एक बार टकराए, लेकिन सी नहीं। मैंने कोशिश की है:

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

लेकिन उपरोक्त सी के साथ मेल खाता है।

मैंने भी कोशिश की:

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

उपरोक्त केवल बी के साथ मेल खाता है।

किसी भी प्रकार की मदद की बेहद सराहना की जाती है।

जवाबों:


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


यह काम करता है :) सरणी चाल के बारे में पता नहीं था, धन्यवाद।
१२:१३

कस्टम / गैर-ईआरवी मॉडल के addAttributeToFilterसाथ प्रतिस्थापित किया जाना चाहिए addFieldToFilter

क्या यह निर्धारित करने का कोई तरीका है कि किस सरणी ने परिणाम लौटाया? मैं एक कस्टम मॉडल संग्रह (नाम, विवरण, alternate_name फ़ील्ड) खोजने के लिए इस पद्धति का उपयोग कर रहा हूं और मैं जानना चाहता हूं कि क्या विवरण के कारण परिणाम हिट हुआ था (खोज परिणामों पर अतिरिक्त UI तत्व शामिल करने के लिए)।
pspahn

3
@pspahn एक सीधे आगे नहीं। चयन के निष्पादित होने के बाद आप परिणामों के माध्यम से लूप कर सकते हैं और जांच सकते हैं कि क्या सुई आपके इच्छित फ़ील्ड में पाई गई है।
मेरियस

9

REGEXPइसके बजाय उपयोग करने के लिए एक संभावित समाधान है LIKE:

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

से MySQL प्रलेखन :

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

ये मार्कर शब्द सीमाओं के लिए खड़े होते हैं। वे क्रमशः शब्दों की शुरुआत और अंत से मेल खाते हैं। एक शब्द शब्द वर्णों का एक क्रम है जो शब्द वर्णों से पहले या उसके बाद नहीं है। एक शब्द वर्ण अलनुम वर्ग या एक अंडरस्कोर (_) में एक अल्फ़ान्यूमेरिक वर्ण है।

ध्यान दें कि यदि $needleउन वर्णों को शामिल किया जा सकता है जिनके पास POSIX नियमित अभिव्यक्ति में विशेष अर्थ हैं, तो आपको उनसे बचने की आवश्यकता है। इसे भी देखें: /programming/4024188/php-function-to-escape-mysql-regexp-syntax


3

स्वीकृत उत्तर ठीक से काम नहीं करता है। यह पाठ से पहले और बाद में केवल स्थान की जाँच कर रहा है।

मान लीजिए, आपकी निम्नलिखित सूची है

  • जैकेट
  • समर जैकेट
  • सर्दियों की जैकेट

अब यदि आप स्वीकृत उत्तर का उपयोग करके जैकेट के साथ खोज करने का प्रयास करते हैं, तो यह केवल समर जैकेट और विंटर जैकेट ही लौटाएगा

मुझे लगता है कि निम्नलिखित समाधान बेहतर है

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

यह प्रश्न से केस (सी) को कवर नहीं करेगा (यानी "जैकेटिंग" से भी मेल खाता है)। इसके बजाय, एक ['eq' => $needle]सटीक स्थिति को सटीक मिलान (या बेहतर, खोजने के लिए जोड़ा जा सकता है) का उपयोग करें, जो सभी सीमाओं का पता
लगाने वाले रेक्सक्स

उपरोक्त कोड सटीक मिलान खोजने में सक्षम है। मैंने इसे चेक किया
दिनेश यादव

मुझे उस पर शक नहीं हुआ। लेकिन यह अधिक पाता है, जिसे यह नहीं करना चाहिए। कम से कम यदि आपके पास मूल प्रश्न के समान आवश्यकताएं हैं: "फू बार" की खोज करते समय "फू
बरर

हाँ आप सही है। स्वीकृत उत्तर मेरे लिए ठीक से काम नहीं कर रहा था, इसलिए मैंने इसी तरह की वस्तुओं को प्राप्त करने के लिए सरल एक-लाइन फ़िल्टर का सुझाव दिया।
दिनेश यादव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.