Magento深入理解-Grid报错clause is ambiguous问题
我记得之前没少讲过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'
,
)
)
;
爽~~过滤正常了~~ :)