Присоединение клиента к атрибуту - PullRequest
2 голосов
/ 07 апреля 2011

Я пытаюсь отфильтровать свои заказы, которые возвращаются обратно через magento API по атрибуту клиента. Я пробовал несколько подходов, но ничего не работает.

Я использую атм Magento 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?

1 Ответ

4 голосов
/ 07 апреля 2011

Всякий раз, когда мне нужно сделать это, я использую что-то вроде:
Присоединение таблицы EAV (с атрибутами) к плоской таблице

Это не очень хорошо оптимизировано, но вы должны быть в состояниичтобы выбрать детали, которые вам нужны.

PS.
Я думаю, что я объясню, что я имею в виду под оптимизацией, так как это важно.В основе метода лежит этот бит:

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

Если вы знаете MySQL, вы будете знать, что при присоединении к таблице будет выбран только один индекс, чем конкретнее, тем лучше.В этом случае используются только поля entity_id и attribute_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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...