Bunun için biraz bağlam. Daha fazla sütuna sahip olmak için müşteri siparişi ihracat fonksiyonunu (ızgara üzerinden) genişletmek istiyorum. Dışa aktarma için yeni bir ızgara ekleyen bir modül ve ayrıca orijinali genişleten yeni bir koleksiyon modeli oluşturdum. Bu _beforeLoad () işlevini kullanır, böylece ihtiyacım olan tabloları birleştirebilirim.
Karşılaştığım sorun şu ki, kılavuzdaki filtreler eklendiğinde (increment_id, sipariş tarihi vb.), Bu ekleme cümlesi tablonun önüne geçmiyor ve belirsiz sütun isimleriyle ilgili sorunlar alıyorum. Örneğin, increment_id'de sorunu where cümlesinde yaşıyorum:
SELECT `main_table`.*, `sales`.`total_qty_ordered`, `sales`.`entity_id` AS `order_id`, `sagepay`.`vendor_tx_code` FROM `sales_flat_order_grid` AS `main_table`
LEFT JOIN `sales_flat_order` AS `sales` ON main_table.increment_id = sales.increment_id
LEFT JOIN `sagepaysuite_transaction` AS `sagepay` ON order_id = sagepay.order_id WHERE (increment_id LIKE '%100000261%') GROUP BY `main_table`.`entity_id`
Bu, yan tümce _addColumnFilterToCollection () işlevindeki diğer tablolara katılmadan önce eklenir
protected function _addColumnFilterToCollection($column)
{
if ($this->getCollection()) {
$field = ( $column->getFilterIndex() ) ? $column->getFilterIndex() : $column->getIndex();
if ($column->getFilterConditionCallback()) {
call_user_func($column->getFilterConditionCallback(), $this->getCollection(), $column);
} else {
$cond = $column->getFilter()->getCondition();
if ($field && isset($cond)) {
// Filter added at this point
$this->getCollection()->addFieldToFilter($field , $cond);
}
}
}
return $this;
}
Kısa bir test olarak hattı değiştirdim.
$this->getCollection()->addFieldToFilter('main_table.' . $field , $cond);
ve bu işe yaradı ama bunu yapmak için harika bir yol hissetmiyor.
Kodum _beforeLoad () isminde
protected function _beforeLoad()
{
// Join the sales_flat_order table to get order_id and and total_qty_ordered
$this->getSelect()->joinLeft(array('sales' => $this->getTable('sales/order')),
'main_table.increment_id = sales.increment_id',
array('total_qty_ordered' => 'sales.total_qty_ordered',
'order_id' => 'sales.entity_id'));
// Join the SagePay transaction table to get vendor_tx_code
$this->getSelect()->joinLeft(array('sagepay' => $this->getTable('sagepaysuite2/sagepaysuite_transaction')),
'order_id = sagepay.order_id',
array('vendor_tx_code' => 'vendor_tx_code'));
$this->getSelect()->group('main_table.entity_id');
parent::_beforeLoad();
}
Increment_id'yi satış siparişi ızgara tablosuna ve SagePay işlem tablosuna katılmak için görmem gerekiyor, çünkü görebildiğim tek ortak kimlik bu.
Temel olarak, bununla baş etmenin en iyi yaklaşımının ne olduğunu merak ediyorum. Muhtemelen yukarıda belirttiğim değişikliği yapmaktan kurtulabilirdim ama doğru gelmiyor. Join ifadelerimde değiştirebileceğim bir şey var mı?
Teşekkürler.