Magento Inner Регистрация и заказ - PullRequest
1 голос
/ 24 августа 2011

На странице каталога Magento есть присоединение к коллекции.Объединение работает отлично.

$products->joinTable(
    array('as_name' => 'some_table'),
    'product_id=entity_id',
    array('some_var' => 'variable'),
    array('store_id' => array('eq' => '1')),
    'inner'
);

Если бы я должен был выполнить необработанный запрос, столбец some_var будет иметь правильные значения.Также, если я добавлю ORDER BY some_var DESC raw, все будет правильно.Однако, если я использую Magento $products->setOrder('some_var', 'desc');, запрос, который отправляет Magento, становится следующим:

ORDER BY `e`.`some_var` DESC

Как мне заставить Magento не добавлять "e"?some_var не является частью этого выбора, и должно быть as_name.

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

разобрался: $collection->getSelect()->order('some_var DESC');

1 голос
/ 24 августа 2011

Возможно, что если псевдоним, указанный вами для объединенного столбца, фактически совпадает со столбцом в базовой таблице, вы столкнетесь с проблемой.

addAttributeToSort () проверяет столбец в _joinFieldsсначала, и если он найден (что будет в вашем случае), то он вызывает _getAttributeFieldName () для разрешения псевдонима в полностью определенную ссылку на столбец._getAttributeFieldName () проверяет псевдоним в _staticFields ДО того, как он проверяет _joinFields.Это означает, что если у вас есть конфликт, столбцы базовой таблицы выигрывают.

public function addAttributeToSort($attribute, $dir='asc')
{
    if (isset($this->_joinFields[$attribute])) {
        $this->getSelect()->order($this->_getAttributeFieldName($attribute).' '.$dir);
        return $this;
    }
    if (isset($this->_staticFields[$attribute])) {
        $this->getSelect()->order("e.{$attribute} {$dir}");
    }
    if (isset($this->_joinAttributes[$attribute])) {
        $attrInstance = $this->_joinAttributes[$attribute]['attribute'];
        $entityField = $this->_getAttributeTableAlias($attribute).'.'.$attrInstance->getAttributeCode();
    } else {
        $attrInstance = $this->getEntity()->getAttribute($attribute);
        $entityField = 'e.'.$attribute;
    }
    if ($attrInstance) {
        if ($attrInstance->getBackend()->isStatic()) {
            $this->getSelect()->order($entityField.' '.$dir);
        } else {
            $this->_addAttributeJoin($attribute, 'left');
            if (isset($this->_joinAttributes[$attribute])) {
                $this->getSelect()->order($attribute.' '.$dir);
            } else {
                $this->getSelect()->order($this->_getAttributeTableAlias($attribute).'.value '.$dir);
            }
        }
    }
    return $this;
}

protected function _getAttributeFieldName($attributeCode)
{
    if (isset($this->_joinAttributes[$attributeCode]['condition_alias'])) {
        return $this->_joinAttributes[$attributeCode]['condition_alias'];
    }
    if (isset($this->_staticFields[$attributeCode])) {
        return sprintf('e.%s', $attributeCode);
    }
    if (isset($this->_joinFields[$attributeCode])) {
        $attr = $this->_joinFields[$attributeCode];
        return $attr['table'] ? $attr['table'] .'.'.$attr['field'] : $attr['field'];
    }

    $attribute = $this->getAttribute($attributeCode);
    if (!$attribute) {
        throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid attribute name: %s.', $attributeCode));
    }

    if ($attribute->isStatic()) {
        if (isset($this->_joinAttributes[$attributeCode])) {
            $fieldName = $this->_getAttributeTableAlias($attributeCode).'.'.$attributeCode;
        } else {
            $fieldName = 'e.'.$attributeCode;
        }
    } else {
        $fieldName = $this->_getAttributeTableAlias($attributeCode).'.value';
    }
    return $fieldName;
}

NB : Все это по предположению Magento 1.5, поскольку вы не указали свою версию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...