【问题标题】:Magento Inner Join and OrderingMagento 内部连接和排序
【发布时间】:2011-08-24 15:35:36
【问题描述】:

在 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

【问题讨论】:

  • 由于您已更改所有别名和列名,因此有点难以确定。

标签: mysql magento join


【解决方案1】:

想通了: $collection->getSelect()->order('some_var DESC');

【讨论】:

    【解决方案2】:

    如果您为连接列指定的别名实际上与基表中的列相同,则可能会遇到问题。

    addAttributeToSort() 首先检查 _joinFields 中的列,如果找到(在您的情况下),然后调用 _getAttributeFieldName() 以将别名解析为完全限定的列引用。 _getAttributeFieldName() 在检查 _joinFields 之前检查 _staticFields 中的别名。这意味着如果您有冲突,则基表列获胜。

    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;
    }
    

    注意:所有这些都是基于 Magento 1.5 的假设,因为您没有列出您的版本

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 2011-03-01
      • 2015-05-02
      相关资源
      最近更新 更多