Magento collection มีวิธีการกรองสองแบบที่แตกต่างกัน
- Varien_Data_Collection_Db :: addFieldToFilter
addFieldToFilter (เขตข้อมูล $, $ เงื่อนไข = null)
พารามิเตอร์แรกของ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')'
โปรดทราบว่าสิ่งนี้อาจซับซ้อนได้อย่างรวดเร็วหากคุณใช้แอตทริบิวต์ EAV เพิ่มคุณสมบัติ
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('meta_title','my title')
->getSelect()
);
และแบบสอบถามได้รับ gnarly
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 Array มันคือกุญแจสำคัญ eq ซึ่งหมายถึงเท่ากับ ค่าสำหรับคีย์นี้คือ n2610 ซึ่งเป็นค่าที่เรากำลังกรอง
Magento มีภาษาอังกฤษจำนวนหนึ่งเช่นตัวกรองที่จะทำให้ความทรงจำฉีกขาด (และอาจจะเจ็บปวด) กับนักพัฒนา perl เก่า ๆ ในกลุ่มผู้ชม
รายการด้านล่างเป็นตัวกรองทั้งหมดพร้อมกับตัวอย่างของการเทียบเท่า 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'
ส่วนใหญ่เหล่านี้อธิบายด้วยตนเอง แต่บางคนสมควรได้รับข้อความเสริมพิเศษ
ใน, nin, find_in_set เงื่อนไข in และ nin อนุญาตให้คุณผ่านใน Array of values นั่นคือส่วนค่าของอาร์เรย์ตัวกรองของคุณได้รับอนุญาตให้เป็นอาร์เรย์
array("in"=>array('n2610','ABC123')
WHERE (e.sku in ('n2610','ABC123'))
ไม่เป็นโมฆะคำสำคัญ NULL มีความพิเศษใน SQL รสชาติส่วนใหญ่ โดยทั่วไปแล้วจะไม่เล่นได้ดีกับตัวดำเนินการมาตรฐานความเท่าเทียม (=) การระบุ notnull หรือ null เป็นประเภทตัวกรองของคุณคุณจะได้รับไวยากรณ์ที่ถูกต้องสำหรับการเปรียบเทียบค่า NULL โดยไม่สนใจค่าใด ๆ ที่คุณส่งผ่าน
array("notnull"=>'n2610')
WHERE (e.sku is NOT NULL)
from - to filter นี่เป็นรูปแบบพิเศษอีกรูปแบบหนึ่งที่ละเมิดกฎมาตรฐาน แทนที่จะเป็นอาเรย์องค์ประกอบเดียวคุณต้องระบุอาเรย์สององค์ประกอบ องค์ประกอบหนึ่งมีกุญแจจากองค์ประกอบอื่นมีกุญแจไป ตามที่ระบุไว้ตัวกรองนี้อนุญาตให้คุณสร้างช่วงจาก / ถึงโดยไม่ต้องกังวลเกี่ยวกับสัญลักษณ์ที่มากกว่าและน้อยกว่า
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')'
และหรือหรือหรือว่านั้นและและหรือ? ในที่สุดเราก็มาถึงผู้ประกอบการบูลีน เป็นช่วงเวลาที่ไม่ค่อยเกิดขึ้นซึ่งเรากรองโดยแอตทริบิวต์เดียวเท่านั้น โชคดีที่กลุ่มของวีโอไอพีได้รับความคุ้มครอง คุณสามารถโยงการโทรหลายสายเข้าด้วยกันเพื่อ addFieldToFilter เพื่อรับข้อความค้นหา“ AND” จำนวนมาก
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 ระเบียนเสมอ ไม่มี sku สามารถเริ่มต้นด้วยทั้ง a และ a สิ่งที่เราอาจต้องการคือแบบสอบถาม OR สิ่งนี้นำเราไปสู่อีกมุมมองที่สับสนของพารามิเตอร์ที่สองของ addFieldToFilter
หากคุณต้องการสร้างแบบสอบถาม OR คุณจะต้องผ่าน Array of filter Array เป็นพารามิเตอร์ตัวที่สอง ฉันคิดว่าเป็นการดีที่สุดที่จะกำหนดอาร์เรย์ตัวกรองแต่ละตัวให้กับตัวแปร
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 (((e.sku like 'a%') or (e.sku like 'b%')))
- Varien_Data_Collection :: addFilter
addFilter($field, $value, $type = 'and')
addFilter()
อนุญาตให้กรองฟิลด์เดียวด้วยค่าเดียวและประเภทเท่านั้น $type
สามารถใด ๆ ของ:
- "และ" (ค่าเริ่มต้น) - เพิ่ม AND $ field = $ value ในส่วนคำสั่ง WHERE
- "หรือ" - เพิ่ม "OR $ field = $ value ให้กับ WHERE clause
ดูรายละเอียดเพิ่มเติม
addFilter
กับattributes
?