在属性上加入客户

时间:2011-04-07 10:09:49

标签: php zend-framework magento

我正在尝试过滤我的订单,这些订单由magento API通过客户属性返回。我尝试了几种方法,但似乎没什么用。

我正在使用Magento 1.4.1.1 atm,而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这样的平台上是不可能的?

1 个答案:

答案 0 :(得分: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'