Ich versuche, eine riesige Sammlung von Kundenaufträgen zu filtern. Es gibt mehr als 5 Millionen Datensätze. Unten ist mein Code, um die Auftragssammlung zu erhalten, und ich füge auch einige Verknüpfungen hinzu, um die gewünschten Spalten zu erhalten
$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'));
Wenn ich die addAttributeToFilter
Funktion auf diese Sammlung anwende, dauert es 10 Minuten, um das Ergebnis abzurufen. Meine Frage ist, ob es eine effiziente und schnelle Möglichkeit gibt, die Sammlung zu filtern
Aktualisieren
Unten sind meine Filterlogiken. Ich möchte eine Bestellung mit verschiedenen Filtern suchen
$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))));
}
quelle
walk
Methode ist genau das, was Sie brauchenDie schnellste und effektivste Möglichkeit, mit der letzten Datengröße umzugehen, ist die Verwendung der MY SQL-Abfrage in Magento, um die gewünschten Spaltendaten abzurufen.
Um eine Auswahl auszuführen, können Sie Folgendes tun:
quelle
fetchAll
ist definitiv nicht der schnellste und effektivste Weg