我记得之前没少讲过Grid,今天在写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', ));
爽~~过滤正常了~~ :)