最新消息:Excel无乱码转CSV,由于工作原因很少更新博客和回复大家的评论,非常抱歉。

Magento Grid报错clause is ambiguous问题

今天在扩展Grid遇到这样一个错误,将解决办法分享下。

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'increment_id' in where clause is ambiguous

这个错误怎么来的呢,关键是clause is ambiguous。

使用Grid必须要设置一个Collection,往往这个Grid需要联表查询,就是写join语句。请看下面例子:

protected function _getCollectionClass()
    {
        return 'sales/order_shipment_grid_collection';
    }

    protected function _prepareCollection()
    {
        $collection = G::getResourceModel($this->_getCollectionClass());
        $collection->getSelect()
        			->joinLeft(array('o'=>'sales_flat_order'),'main_table.order_id = o.entity_id','grand_total')
        			->joinLeft(array('st'=>'sales_flat_shipment_track'),'main_table.order_id = st.order_id',array('carrier_code','number','shipped_time'));

        $this->setCollection($collection);
        return parent::_prepareCollection();
    }

这段例子是我改写后台配送模块时用到的。原来只是一个简单的表,因为需要跟COD结算、还要监督发货部门的效率。所以需要将订单金额、发货时间等等联表查询出来,问题出在shipment表有个increment_id字段,而关联的order表同样也有这个increment_id字段。

按下面的这样来配置Grid:

$this->addColumn('increment_id', array(
            'header'    => G::helper('sales')->__('Shipment #'),
            'index'     => 'increment_id',
            'type'      => 'text',
        ));

本来我们这里的increment id是物流号,而订单里的increment id是订单号,打开页面,Grid可以正常显示,但是当尝试搜索物流号的时候就会报错了,就是上面的错误。
于是开始找哇,几乎看遍了后台所有的grid,就不信找不到,终于出现了这样一段代码:

$this->addColumn('created_at', array(
            'header'    =>G::helper('reports')->__('Created At'),
            'width'     =>'170px',
            'type'      =>'datetime',
            'index'     =>'created_at',
            'filter_index'=>'main_table.created_at',
            'sortable'  =>false
        ));

        $this->addColumn('updated_at', array(
            'header'    =>G::helper('reports')->__('Updated At'),
            'width'     =>'170px',
            'type'      =>'datetime',
            'index'     =>'updated_at',
            'filter_index'=>'main_table.updated_at',
            'sortable'  =>false
        ));

请看G_Adminhtml_Block_Report_Shopcart_Abandoned_Grid这个文件。
原来Column可以设置filter_index,之前自己还尝试’index’=>’main_table.increament_id’等等,原来这样就可了,于是上面我改的代码变成了这样:

$this->addColumn('increment_id', array(
            'header'    => G::helper('sales')->__('Shipment #'),
            'index'     => 'increment_id',
            'filter_index' =>'main_table.increment_id',
            'type'      => 'text',
        ));

原因:关联了多表后,表与表之间有相同字段出现。在多表查询时,如何正确的写SQL,我想你应该知道是什么原因了,就是字段归属的问题。我也是折腾了好久才知道是什么原因,起初一直认为Magento会处理这个问题,我真的错了。于是在精東·博客找到了这篇文章,分享出来便于大家查找。

转载请注明:嗨酷哥,有你更酷! » Magento Grid报错clause is ambiguous问题

与本文相关文章

发表我的评论

取消评论
表情 插代码

Hi,您需要填写昵称和邮箱!

  • 必填项
  • 必填项

网友评论1

  1. 我也遇到了同样的问题,搞了一个晚上都没解决。然后在stockoverflow上找到了哦问题的办法,就是加一个filter_index。真是爽惨咯! 楼主能否告知一下Q,有问题我们可以探讨

    brave2014-03-14 11:24 回复