2017-05-17 5 views
5

मेरे पास मेरे खोज फ़ॉर्म के लिए SQL क्वेरी है।मेरी SQL क्वेरी को वाक्य में कई शब्दों को कैसे खोजा जाए, भले ही वे एक-दूसरे का पालन न करें

$term = $request->get('term'); 

$queries = Article::where('title', 'LIKE', '%' . $term . '%')->published()->get(); 

मेरा शोध काम कर रहा है। अगर मेरे पास "मेरा महान लेख अद्भुत है" नामक एक लेख है और मैं अपने खोज फ़ॉर्म "ग्रेट लेख" में लिखता हूं तो यह काम करता है।

लेकिन अगर मैं "आलेख कमाल" लिखता हूं, तो शब्द एक-दूसरे का पालन नहीं करते हैं, और यह काम नहीं करता है।

कीवर्ड के साथ काम करने के लिए मैं अपनी क्वेरी कैसे प्राप्त करूं?

धन्यवाद

+0

से बचने के लिए रिक्त स्थान पर स्ट्रिंग विस्फोट ताकि आप शब्दों के साथ एक सरणी मिल बचने इंजेक्शन जोड़ने के लिए लगता है। सूची के माध्यम से लूप करें और प्रत्येक शब्द के लिए 'जहां (' शीर्षक ',' जैसे '....)' जोड़ें। –

+0

मुझे लगता है कि आप तकनीकी रूप से अपने खोज शब्द को अलग-अलग शब्दों में विभाजित कर सकते हैं, फिर उन्हें सभी संभावित क्रमिक क्रम में पुनर्व्यवस्थित कर सकते हैं और क्रमपरिवर्तन की तरह 1 या क्रमपरिवर्तन 2 आदि का उपयोग कर सकते हैं लेकिन यह बहुत अक्षम होगा ... एक आसान तरीका होना चाहिए। मुझे कुछ और शोध करने दें ... –

+0

यह MySQL का अच्छा नहीं है। इस प्रकार की समस्या काफी बार फसल होती है - खासकर आनुवंशिकीविदों के बीच। थोड़ी देर के लिए कुछ एसक्यूएल कार्यों के साथ गड़बड़ करने के बाद, अनिवार्य रूप से लोग एप्लिकेशन कोड में तर्क को संभालने में लगते हैं। – Strawberry

उत्तर

8

इस प्रकार की तरह आप कुछ कर सकते हैं उल्लेख किया हल होगा कोशिश मत करो:

$term = $request->get('term'); 
$keywords = explode(" ", $term); 

$article = Article::query(); 
foreach($keywords as $word){ 
    $article->orWhere('title', 'LIKE', '%'.$word.'%'); 
} 

$articles = $article->published()->get(); 

यदि आप केवल परिणाम चाहते हैं जिसमें क्वेरी में सभी शब्द शामिल हैं where के साथ orWhere को बदलें।

आप को फ़िल्टर करने के कुछ शब्दों को आप की तरह कुछ जोड़ सकते हैं चाहते हैं:

$filteredKeywords = array_filter($keywords, function($word) { 
    return strlen($word) > 2; 
}); 
+3

ग्रेट उत्तर। जब मैंने यह जवाब देखा तो वास्तव में वही बात लिख रही थी। +1 –

+0

@chasenyc इस विधि के साथ, मैं शब्दों को कैसे फ़िल्टर करूं? उदाहरण के लिए, मैं "ए" "" ए "और" नहीं "चाहता हूं ... धन्यवाद! – Jeremy

+1

@ जेरेमी मैंने कुछ शब्दों को फ़िल्टर करने के लिए कुछ विकल्प जोड़े हैं। –

1

कारण है कि आप '%' के साथ कि

$search = "article awesome"; 
$search = preg_replace("#\s+#", '%', $search); 

की जगह रिक्त स्थान की तरह कुछ मामले आपको

+1

लेकिन यदि खोज शब्द में रिवर्स ऑर्डर, 'कमाल लेख' शब्द हैं, तो यह आलेख – ayip

+0

नहीं मिला है, मैंने आपके लिए एक और जवाब जोड़ा है, मुझे उम्मीद है कि यह आपकी तलाश है। – zakaria35

0

आप करना चाहते हैं:

$filtered = ["a", "an", "the"]; 
$filteredKeywords = array_diff($keywords, $filtered); 

वैकल्पिक रूप से यदि आप और अधिक गतिशील होना चाहते हैं तो आप एक बंद पारित कर सकते हैं खोज शब्द अनदेखी आदेश इस

$search = trim(" article awesome great "); 
$search = preg_split("#\s+#", $search); 
$where = "WHERE column like '%" . implode("%' AND column like '%", $search) . "%'"; 

काम करना चाहिए लेकिन यह ले जाएगा बनाने मोर ई निष्पादन समय और सर्वर पर संसाधन,

भी कुछ एसक्यूएल वाक्यविन्यास त्रुटियों

संबंधित मुद्दे