2011-04-07 81 views
2

我试图过滤由客户属性通过magento API返回的订单。我尝试了几种方法,但似乎没有任何工作。加入客户属性

我使用Magento的ATM 1.4.1.1和API做到这一点的时刻:

$billingAliasName = 'billing_o_a'; 
$shippingAliasName = 'shipping_o_a'; 


    $collection = Mage::getModel("sales/order")->getCollection() 
     ->addAttributeToSelect('*') 
     ->addAddressFields() 
     ->addExpressionFieldToSelect(
      'billing_firstname', "{{billing_firstname}}", array('billing_firstname'=>"$billingAliasName.firstname") 
     ) 
     ->addExpressionFieldToSelect(
      'billing_lastname', "{{billing_lastname}}", array('billing_lastname'=>"$billingAliasName.lastname") 
     ) 
     ->addExpressionFieldToSelect(
      'shipping_firstname', "{{shipping_firstname}}", array('shipping_firstname'=>"$shippingAliasName.firstname") 
     ) 
     ->addExpressionFieldToSelect(
      'shipping_lastname', "{{shipping_lastname}}", array('shipping_lastname'=>"$shippingAliasName.lastname") 
     ) 
     ->addExpressionFieldToSelect(
       'billing_name', 
       "CONCAT({{billing_firstname}}, ' ', {{billing_lastname}})", 
       array('billing_firstname'=>"$billingAliasName.firstname", 'billing_lastname'=>"$billingAliasName.lastname") 
     ) 
     ->addExpressionFieldToSelect(
       'shipping_name', 
       'CONCAT({{shipping_firstname}}, " ", {{shipping_lastname}})', 
       array('shipping_firstname'=>"$shippingAliasName.firstname", 'shipping_lastname'=>"$shippingAliasName.lastname") 
     ); 

这是默认的API调用,我猜。现在我只想加入一个名为update的客户属性 - 我该如何实现这个简单的任务?

或者这是不可能在像sales_flat_order这样的平板上?

+0

+1对于'addExpressionFieldToSelect',我经常看不到使用正确。 – clockworkgeek 2011-04-07 11:43:16

回答

4

每当我需要做的这一点,我使用类似:
Joining An EAV Table (With Attributes) To A Flat Table

这不是很好的优化,但你应该能够挑选出您需要的部分。

PS。
我想我会解释我的意思是通过优化,因为它很重要。在该方法的心脏是该位:

->joinLeft(array($alias => $table), 
    'main_table.'.$mainTableForeignKey.' = '.$alias.'.entity_id and '.$alias.'.attribute_id = '.$attribute->getAttributeId(), 
    array($attribute->getAttributeCode() => $field) 
); 

如果你知道MySQL的,那么你就会知道,加入一个表时,越具体越好,只会选择一个指标。在这种情况下,只有entity_idattribute_id字段正在使用,所以MySQL仅限于这些字段。两列都被编入索引,但基数很低。

如果条件还包括实体类型,那么MySQL可以选择使用IDX_BASE,它按顺序对列entity_type_id,entity_id,attribute_id,store_id进行索引(它需要从左到右处理它们)。因此,像这样的东西会导致EAV性能大幅提高 - 这取决于“左”表上有多少行可能会好几百或几千倍。

$alias.'.entity_type_id='.$entityType->getId().' AND main_table.'.$mainTableForeignKey.' = '.$alias.'.entity_id AND '.$alias.'.attribute_id = '.$attribute->getAttributeId().' AND '.$alias.'.store_id=0'