大量の販売注文をフィルタリングしようとしています。その中に500万以上のレコードがあります。以下は注文コレクションを取得するためのコードです。また、目的の列を取得するためにいくつかの結合を配置します
$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'));
addAttributeToFilter
このコレクションに関数を適用すると、結果を取得するのに10分かかります。私の質問は、コレクションをフィルタリングする効率的かつ高速な方法があるということです
更新
以下は私のフィルターロジックです。別のフィルターを使用して注文を検索したい
$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))));
}