Magento - 完整性约束违规:1052 - 送货方式

时间:2015-04-14 12:03:28

标签: sql magento filter mysql-error-1054

以下代码允许在订单/销售页面中添加一列,其中将送货方式显示为包含所有送货承运人的送货说明。

_prepareCollection

$collection->getSelect()->join('sales_flat_order', 'main_table.entity_id = sales_flat_order.entity_id',array('shipping_description'));

_prepareColumn

$this->addColumn('shipping_method', array(
'header' => Mage::helper('sales')->__('Shipping Method'),
'index' => 'shipping_description',
'filter_index' => 'main_table.status',
));

编译完所有内容后,送货方式看起来很完美。现在,当我尝试通过prcessing对命令进行排序并点击搜索时,会出现此错误:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'status' in where clause is ambiguous, query was: SELECT COUNT(*) FROM `sales_flat_order_grid` AS `main_table` INNER JOIN `sales_flat_order` ON main_table.entity_id = sales_flat_order.entity_id WHERE (status = 'processing')

经过一些研究后,这意味着当表格连接时存在双重状态,现在我如何从中创建一个alians以及如何应用它。此外,如果有人知道按此列过滤/排序的方式会很棒。

PS。该文件位于: 应用程序/代码/本地/法师/ Adminhtml /砌块/销售/顺序

编辑:现在我正在尝试找出如何根据数据库中的值创建选项下拉列表。这是我试图开始工作的代码:

private static $_deliveryGroups = array();

public static function getDeliveryArray() {
if (count(self::$_deliveryGroups) == 0) {
    $delivery_group = new Mage_Shipping_Model_Group();
    $delivery_groups = $delivery_group->getColection()->toOptionHash();
    self::$_deliveryGroups = $delivery_groups;
}
return self::$_deliveryGroups;
}

Grid.php中的其他值

    $this->addColumn('shipping_method', array(
    'header' => Mage::helper('sales')->__('Shipping Method'),
    'renderer'  => 'Vehence_Module_Block_Adminhtml_Block_Sales_Order_Desc',
    'type' => 'options',
    'options' => Vehence_Module_Block_Adminhtml_Block_Sales_Order_Desc::getDeliveryArray(),
    ));

而且:

protected function _getAttributeOptions($attribute_code)
    {
        $attribute = Mage::getModel('sales/order')->getAttribute('shipping_description', $attribute_code);
        $options = array();
        foreach( $attribute->getSource()->getAllOptions(true, true) as $option ) {
            $options[$option['value']] = $option['label'];
        }
        return $options;
}

2 个答案:

答案 0 :(得分:1)

您需要为新字段使用自定义渲染器。然后在渲染器方法中,您有orderId。使用该ID,您可以实例化订单对象并获取并输出您喜欢的任何字段。

以下是一个示例:https://magento.stackexchange.com/questions/62856/how-to-get-latest-order-comment-on-the-order-grid-column/62859#62859

class Vendor_Module_Block_Renderer_Shipping extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{
    public function render(Varien_Object $row)
    {
        $orderId = $row->getId();
        $order = Mage::getModel('sales/order')->load($orderId);
        return $order->getData('shipping_description');
    }
}

对于以下方法(更好地重写)添加:

$this->addColumn('history', array(
    'header' => Mage::helper('sales')->__('History status'),
    'type'  => 'text',
    'renderer' => new Vendor_Module_Block_Renderer_Shipping()
));

<强> upd.1

所以... 我没有在我的解决方案中应用任何过滤器。问题在于订单收集。在视觉上它看起来很好,但所有过滤器都应用了不包含过滤必要字段的集合。那是因为我拒绝了我的解决方案。

那是因为我认为你的解决方案为此目的要好得多,我决定解决它。我为该模块创建了git存储库。它应该有效。检查一下:https://github.com/zhartaunik/AddField

希望它会有所帮助

答案 1 :(得分:0)

您需要添加额外的数组选项才能解决此问题,即filter_index

$this->addColumn('status', array(
        'header' => Mage::helper('sales')->__('Status'),
        'index' => 'status',
        '**filter_index' => 'main_table.status**',
        'type'  => 'options',
        'width' => '70px',
        'options' => Mage::getSingleton('sales/order_config')->getStatuses(),
));