Magento संग्रह में अलग-अलग फ़िल्टर करने के दो तरीके हैं
- Varien_Data_Collection_Db :: addFieldToFilter
addFieldToFilter ($ फ़ील्ड, $ स्थिति = अशक्त)
का पहला पैरामीटर addFieldToFilter
वह विशेषता है जिसे आप फ़िल्टर करना चाहते हैं। दूसरा वह मान है जिसकी आप तलाश कर रहे हैं। यहां हम sku
मान के लिए एक फ़िल्टर जोड़ रहे हैं n2610
।
दूसरे पैरामीटर का उपयोग उस प्रकार को फ़िल्टर करने के लिए भी किया जा सकता है जिसे आप करना चाहते हैं। यह वह जगह है जहां चीजें थोड़ी जटिल हो जाती हैं, और थोड़ी अधिक गहराई के साथ जाने लायक हो जाती हैं।
तो डिफ़ॉल्ट रूप से, निम्नलिखित
$collection_of_products->addFieldToFilter('sku','n2610');
(अनिवार्य रूप से) के बराबर है
WHERE sku = "n2610"
आप खुद ही देख लें। निम्नलिखित चल रहा है
public function testAction()
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku','n2610')
->getSelect());
}
निकलेगा
SELECT `e`.* FROM `catalog_product_entity` AS `e` WHERE (e.sku = 'n2610')'
ध्यान रखें, यदि आप एक ईएवी विशेषता का उपयोग कर रहे हैं, तो यह तेजी से जटिल हो सकता है। एक विशेषता जोड़ें
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('meta_title','my title')
->getSelect()
);
और क्वेरी स्पष्ट रूप से हो जाती है।
SELECT `e`.*, IF(_table_meta_title.value_id>0, _table_meta_title.value, _table_meta_title_default.value) AS `meta_title`
FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_product_entity_varchar` AS `_table_meta_title_default`
ON (_table_meta_title_default.entity_id = e.entity_id) AND (_table_meta_title_default.attribute_id='103')
AND _table_meta_title_default.store_id=0
LEFT JOIN `catalog_product_entity_varchar` AS `_table_meta_title`
ON (_table_meta_title.entity_id = e.entity_id) AND (_table_meta_title.attribute_id='103')
AND (_table_meta_title.store_id='1')
WHERE (IF(_table_meta_title.value_id>0, _table_meta_title.value, _table_meta_title_default.value) = 'my title')
यदि आप समय सीमा पर हैं, तो इस बिंदु को विस्तृत न करें, लेकिन SQL के बारे में बहुत अधिक न सोचने का प्रयास करें।
अन्य तुलनात्मक ऑपरेटर मुझे यकीन है कि आप सोच रहे हैं "क्या होगा अगर मैं क्वेरी के बराबर के अलावा कुछ और चाहता हूं"? नहीं के बराबर, से अधिक, कम, आदि। AddFieldToFilter विधि के दूसरे पैरामीटर ने आपको वहां भी कवर किया है। यह एक वैकल्पिक वाक्यविन्यास का समर्थन करता है, जहां एक स्ट्रिंग में पास होने के बजाय, आप एक एकल तत्व ऐरे में पास होते हैं।
इस सरणी की कुंजी वह प्रकार है जिसकी आप तुलना करना चाहते हैं। उस कुंजी से जुड़ा मूल्य वह मान है जिसे आप फ़िल्टर करना चाहते हैं। चलो उपरोक्त फ़िल्टर को फिर से करें, लेकिन इस स्पष्ट सिंटैक्स के साथ
public function testAction()
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array('eq'=>'n2610'))
->getSelect()
);
}
हमारे फ़िल्टर को कॉल करना
addFieldToFilter('sku',array('eq'=>'n2610'))
जैसा कि आप देख सकते हैं, दूसरा पैरामीटर एक PHP सरणी है। इसकी कुंजी eq है, जो बराबर होती है। इस कुंजी का मान n2610 है, जो वह मान है जिसे हम फ़िल्टर कर रहे हैं।
Magento के पास इन अंग्रेजी भाषा के कई फिल्टर हैं जो दर्शकों में किसी भी पुराने पर्ल डेवलपर्स के लिए स्मरण (और शायद दर्द) का एक आंसू लाएंगे।
नीचे सूचीबद्ध सभी फ़िल्टर उनके SQL समकक्षों के उदाहरण के साथ हैं।
array("eq"=>'n2610')
WHERE (e.sku = 'n2610')
array("neq"=>'n2610')
WHERE (e.sku != 'n2610')
array("like"=>'n2610')
WHERE (e.sku like 'n2610')
array("nlike"=>'n2610')
WHERE (e.sku not like 'n2610')
array("is"=>'n2610')
WHERE (e.sku is 'n2610')
array("in"=>array('n2610'))
WHERE (e.sku in ('n2610'))
array("nin"=>array('n2610'))
WHERE (e.sku not in ('n2610'))
array("notnull"=>'n2610')
WHERE (e.sku is NOT NULL)
array("null"=>'n2610')
WHERE (e.sku is NULL)
array("gt"=>'n2610')
WHERE (e.sku > 'n2610')
array("lt"=>'n2610')
WHERE (e.sku < 'n2610')
array("gteq"=>'n2610')
WHERE (e.sku >= 'n2610')
array("moreq"=>'n2610') //a weird, second way to do greater than equal
WHERE (e.sku >= 'n2610')
array("lteq"=>'n2610')
WHERE (e.sku <= 'n2610')
array("finset"=>array('n2610'))
WHERE (find_in_set('n2610',e.sku))
array('from'=>'10','to'=>'20')
WHERE e.sku >= '10' and e.sku <= '20'
इनमें से अधिकांश आत्म व्याख्यात्मक हैं, लेकिन कुछ एक विशेष कॉलआउट के लायक हैं
में, नौ, find_in_set में और नौ सशर्त आप मूल्यों के एक सरणी में पारित करने के लिए अनुमति देते हैं। अर्थात्, आपके फ़िल्टर सरणी का मान भाग स्वयं एक सरणी होने की अनुमति है।
array("in"=>array('n2610','ABC123')
WHERE (e.sku in ('n2610','ABC123'))
notnull, null SQL के अधिकांश फ्लेवर में कीवर्ड NULL विशेष है। यह आमतौर पर मानक समानता (=) ऑपरेटर के साथ अच्छा नहीं खेलेगा। आपके फ़िल्टर प्रकार के रूप में नोटनल या नल को निर्दिष्ट करना, जो भी आपके द्वारा पास किए गए मूल्य को अनदेखा करते हुए आपको NULL तुलना के लिए सही सिंटैक्स प्राप्त करेगा।
array("notnull"=>'n2610')
WHERE (e.sku is NOT NULL)
से - फ़िल्टर करने के लिए यह एक और विशेष प्रारूप है जो मानक नियम को तोड़ता है। एक एकल तत्व सरणी के बजाय, आप दो तत्व सरणी निर्दिष्ट करते हैं। एक तत्व की कुंजी है, दूसरे तत्व की कुंजी है। संकेतित कुंजियों के रूप में, यह फ़िल्टर आपको प्रतीकों से अधिक और कम के बारे में चिंता किए बिना / से लेकर रेंज तक निर्माण करने की अनुमति देता है
public function testAction
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('price',array('from'=>'10','to'=>'20'))
->getSelect()
);
}
उपरोक्त पैदावार
WHERE (_table_price.value >= '10' and _table_price.value <= '20')'
और या या, या वह और है? अंत में, हम बूलियन ऑपरेटरों के पास आते हैं। यह दुर्लभ क्षण है जहां हम केवल एक विशेषता द्वारा फ़िल्टर कर रहे हैं। सौभाग्य से, Magento के संग्रह हमें कवर किया है। आप “और” प्रश्नों की संख्या प्राप्त करने के लिए AddFieldToFilter में कई कॉल को एक साथ चेन कर सकते हैं।
function testAction()
{
echo(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array('like'=>'a%'))
->addFieldToFilter('sku',array('like'=>'b%'))
->getSelect()
);
}
उपरोक्त के रूप में कई कॉल को एक साथ जोड़कर, हम एक क्लॉज उत्पन्न करेंगे जो निम्नलिखित की तरह कुछ दिखता है
WHERE (e.sku like 'a%') AND (e.sku like 'b%')
आप में से जो सिर्फ अपना हाथ बढ़ाते हैं, हां, उपरोक्त उदाहरण हमेशा 0 रिकॉर्ड लौटाएगा। कोई भी स्कोल BOTH a और a से शुरू नहीं हो सकता है। हम शायद यहाँ एक OR क्वेरी चाहते हैं। यह हमें AddFieldToFilter के दूसरे पैरामीटर के एक और भ्रामक पहलू पर लाता है।
यदि आप OR क्वेरी बनाना चाहते हैं, तो आपको दूसरे पैरामीटर के रूप में एक Array of filter Arrays पास करना होगा। मुझे लगता है कि अपने व्यक्तिगत फ़िल्टर एरेज़ को वेरिएबल्स में असाइन करना सबसे अच्छा है
public function testAction()
{
$filter_a = array('like'=>'a%');
$filter_b = array('like'=>'b%');
}
और फिर मेरे सभी फ़िल्टर चर की एक सरणी असाइन करें
public function testAction()
{
$filter_a = array('like'=>'a%');
$filter_b = array('like'=>'b%');
echo(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array($filter_a,$filter_b))
->getSelect()
);
}
स्पष्ट होने के हित में, यहाँ फ़िल्टर एरे का पूर्वोक्त ऐरे है।
array($filter_a,$filter_b)
यह हमें एक WHERE क्लॉज देगा जो निम्नलिखित की तरह कुछ दिखता है
WHERE (((e.sku like 'a%') or (e.sku like 'b%')))
- Varien_Data_Collection :: addFilter
addFilter($field, $value, $type = 'and')
addFilter()
केवल एकल फ़ील्ड को एक मान और एक प्रकार से फ़िल्टर करने की अनुमति देता है। $type
इनमें से कोई भी हो सकता है:
- "और" (डिफ़ॉल्ट) - जहां और $ क्षेत्र = $ मूल्य जहां क्लॉज के लिए
- "या" - "$ $ फ़ील्ड = $ मान को जहां क्लॉज में जोड़ता है"
अधिक विवरण देखें
addFilter
जिसका हम उपयोग कर सकते हैंattributes
?