Bộ sưu tập Magento có hai phương pháp để lọc dưới đây khác nhau
- Varien_Data_Collection_Db :: addFieldToFilter
addFieldToFilter ($ field, $ condition = null)
Tham số đầu tiên addFieldToFilter
là thuộc tính bạn muốn lọc theo. Thứ hai là giá trị bạn đang tìm kiếm. Đây là chúng tôi thêm một sku
bộ lọc cho giá trị n2610
.
Tham số thứ hai cũng có thể được sử dụng để chỉ định loại bộ lọc bạn muốn làm. Đây là nơi mọi thứ trở nên phức tạp một chút và đáng để đi sâu hơn một chút.
Vì vậy, theo mặc định, sau đây
$collection_of_products->addFieldToFilter('sku','n2610');
là (về cơ bản) tương đương với
WHERE sku = "n2610"
Hãy xem cho chính mình. Chạy như sau
public function testAction()
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku','n2610')
->getSelect());
}
sẽ mang lại
SELECT `e`.* FROM `catalog_product_entity` AS `e` WHERE (e.sku = 'n2610')'
Hãy nhớ rằng, điều này có thể trở nên phức tạp nhanh nếu bạn đang sử dụng thuộc tính EAV. Thêm một thuộc tính
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('meta_title','my title')
->getSelect()
);
và truy vấn được sởn gai ốc.
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')
Không tin vào quan điểm, nhưng cố gắng đừng suy nghĩ quá nhiều về SQL nếu bạn đến hạn chót.
Các toán tử so sánh khác Tôi chắc chắn rằng bạn đang tự hỏi về điều gì nếu tôi muốn một cái gì đó khác với một truy vấn bằng cách truy vấn? Không bằng nhau, lớn hơn, nhỏ hơn, v.v. Tham số thứ hai của phương thức addFieldToFilter cũng được bạn đề cập ở đó. Nó hỗ trợ một cú pháp thay thế trong đó, thay vì truyền vào một chuỗi, bạn truyền vào một mảng phần tử duy nhất.
Chìa khóa của mảng này là kiểu so sánh bạn muốn thực hiện. Giá trị được liên kết với khóa đó là giá trị bạn muốn lọc theo. Hãy làm lại bộ lọc ở trên, nhưng với cú pháp rõ ràng này
public function testAction()
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array('eq'=>'n2610'))
->getSelect()
);
}
Gọi ra bộ lọc của chúng tôi
addFieldToFilter('sku',array('eq'=>'n2610'))
Như bạn có thể thấy, tham số thứ hai là một mảng PHP. Chìa khóa của nó là eq, viết tắt của bằng. Giá trị cho khóa này là n2610, là giá trị chúng tôi đang lọc.
Magento có một số ngôn ngữ tiếng Anh như các bộ lọc sẽ mang lại một giọt nước mắt nhớ (và có lẽ là nỗi đau) cho bất kỳ nhà phát triển perl cũ nào trong khán giả.
Dưới đây là tất cả các bộ lọc, cùng với một ví dụ về các tương đương SQL của chúng.
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'
Hầu hết trong số này là tự giải thích, nhưng một số ít xứng đáng với một chú thích đặc biệt
in, nin, find_in_set Các điều kiện trong và nin cho phép bạn truyền vào một mảng các giá trị. Nghĩa là, phần giá trị của mảng bộ lọc của bạn được phép là một mảng.
array("in"=>array('n2610','ABC123')
WHERE (e.sku in ('n2610','ABC123'))
notnull, null Từ khóa NULL đặc biệt trong hầu hết các hương vị của SQL. Nó thường không chơi tốt với toán tử đẳng thức (=) tiêu chuẩn. Chỉ định notnull hoặc null làm loại bộ lọc của bạn sẽ giúp bạn có được cú pháp chính xác để so sánh NULL trong khi bỏ qua bất kỳ giá trị nào bạn chuyển vào
array("notnull"=>'n2610')
WHERE (e.sku is NOT NULL)
từ - đến bộ lọc Đây là một định dạng đặc biệt khác phá vỡ quy tắc chuẩn. Thay vì một mảng phần tử đơn, bạn chỉ định một mảng hai phần tử. Một yếu tố có chìa khóa từ, yếu tố khác có chìa khóa để. Như các khóa được chỉ định, bộ lọc này cho phép bạn tạo một phạm vi từ / đến phạm vi mà không phải lo lắng về lớn hơn và nhỏ hơn các ký hiệu
public function testAction
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('price',array('from'=>'10','to'=>'20'))
->getSelect()
);
}
Sản lượng trên
WHERE (_table_price.value >= '10' and _table_price.value <= '20')'
VÀ hoặc HOẶC, hoặc đó là HAY và VÀ? Cuối cùng, chúng ta đến với các toán tử boolean. Đó là khoảnh khắc hiếm hoi khi chúng ta chỉ lọc theo một thuộc tính. May mắn thay, Bộ sưu tập của Magento đã bảo vệ chúng tôi. Bạn có thể xâu chuỗi nhiều cuộc gọi với addFieldToFilter để nhận được một số truy vấn của trò chơi TRỰC TIẾP.
function testAction()
{
echo(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array('like'=>'a%'))
->addFieldToFilter('sku',array('like'=>'b%'))
->getSelect()
);
}
Bằng cách kết hợp nhiều cuộc gọi như trên, chúng tôi sẽ tạo ra một mệnh đề where trông giống như sau
WHERE (e.sku like 'a%') AND (e.sku like 'b%')
Đối với những bạn vừa giơ tay, vâng, ví dụ trên sẽ luôn trả về 0 hồ sơ. Không có sku có thể bắt đầu với CẢ HAI a và b. Những gì chúng ta có thể muốn ở đây là một truy vấn HOẶC. Điều này đưa chúng ta đến một khía cạnh khó hiểu khác của tham số thứ hai của addFieldToFilter.
Nếu bạn muốn xây dựng một truy vấn OR, bạn cần truyền một mảng của bộ lọc Mảng trong như là tham số thứ hai. Tôi thấy tốt nhất là chỉ định bộ lọc riêng lẻ của bạn cho các biến
public function testAction()
{
$filter_a = array('like'=>'a%');
$filter_b = array('like'=>'b%');
}
và sau đó gán một mảng của tất cả các biến bộ lọc của tôi
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()
);
}
Để giải thích rõ ràng, đây là Mảng bộ lọc đã nói ở trên.
array($filter_a,$filter_b)
Điều này sẽ cho chúng ta một mệnh đề WHERE trông giống như sau
WHERE (((e.sku like 'a%') or (e.sku like 'b%')))
- Varien_Data_Collection :: addFilter
addFilter($field, $value, $type = 'and')
addFilter()
chỉ cho phép lọc một trường theo một giá trị và một loại. $type
có thể là bất kỳ:
- "và" (mặc định) - thêm AND $ field = $ value vào mệnh đề WHERE
- "hoặc" - thêm "OR $ field = $ value vào mệnh đề WHERE
Xem thêm chi tiết
addFilter
vớiattributes
?