Tôi đang cố gắng để lọc một bộ sưu tập lớn của đơn đặt hàng. Có hơn 5 triệu hồ sơ trong đó. Dưới đây là mã của tôi để có được bộ sưu tập đơn hàng và tôi cũng đặt một số phép nối để có được các cột mong muốn
$resource = Mage::getSingleton('core/resource');
$collection = Mage::getResourceModel('sales/order_grid_collection');
$collection ->join(
'sales/order_item',
'`sales/order_item`.order_id=`main_table`.entity_id',
array(
'skus' => new Zend_Db_Expr('GROUP_CONCAT(`sales/order_item`.sku SEPARATOR "</br>")'),
)
);
$collection->getSelect()->joinLeft(array('sfog' => $resource->getTableName('sales_flat_order_grid')),
'main_table.entity_id = sfog.entity_id',array('sfog.shipping_name','sfog.billing_name'));
$collection->getSelect()->joinLeft(array('sfo'=> $resource->getTableName('sales_flat_order')),
'sfo.entity_id=main_table.entity_id',array('sfo.customer_email','sfo.weight',
'sfo.discount_description','sfo.increment_id','sfo.store_id','sfo.created_at','sfo.status',
'sfo.base_grand_total','sfo.grand_total'));
$collection->getSelect()->joinLeft(array('sfoa'=> $resource->getTableName('sales_flat_order_address')),
'main_table.entity_id = sfoa.parent_id AND sfoa.address_type="shipping"',array('sfoa.street',
'sfoa.city','sfoa.region','sfoa.postcode','sfoa.telephone','sfoa.fax'));
Khi tôi áp dụng addAttributeToFilter
chức năng trên bộ sưu tập này thì phải mất 10 phút để lấy kết quả. Câu hỏi của tôi là có cách nào hiệu quả và nhanh chóng để lọc bộ sưu tập
Cập nhật
Dưới đây là bộ lọc logic của tôi. Tôi muốn tìm kiếm một đơn đặt hàng bằng cách sử dụng các bộ lọc khác nhau
$email = Mage::app()->getRequest()->getParam('email');
$phone = Mage::app()->getRequest()->getParam('phone');
$postcode = Mage::app()->getRequest()->getParam('postcode');
$skus = Mage::app()->getRequest()->getParam('skus');
if($email!='')
{
$collection->addAttributeToFilter('sfo.customer_email',$email);
}
if($phone!='' && $postcode=='')
{
$phone = str_replace(' ', '', $phone); // Replaces all spaces with hyphens.
$phone = preg_replace('/[^A-Za-z0-9\-]/', '', $phone); // Removes special chars.
$collection->addAttributeToSearchFilter(
array(
array(
'attribute' => 'sfoa.telephone',
'eq' => $phone
),
array(
'attribute' => 'sfoa.fax',
'eq' => $phone
)
)
);
}
if($postcode!='' && $phone!='')
{
$collection->addAttributeToFilter('sfoa.postcode',$postcode);
$phone = str_replace(' ', '', $phone); // Replaces all spaces with hyphens.
$phone = preg_replace('/[^A-Za-z0-9\-]/', '', $phone); // Removes special chars.
$collection->addAttributeToFilter('sfoa.telephone',$phone);
}
if($skus!='')
{
$sku_array = explode(",",$skus);
$collection->addAttributeToFilter('sku', array('in' => array('finset' => array($sku_array))));
}