Belirsiz sütun isimleri ile yan tümce yan tümce tümce çakışması


28

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.


1
Masalara nasıl katıldın? Zend_Db_Select modeli üzerinde çalışmak kötü bir fikir çünkü magento ortak tabloları kaydediyor ve normal olarak tüm önekleri ekliyor. Katılmayla
Fabian Blechschmidt

Yanıtınız için teşekkür ederim, bunu okuyacağım. JoinTable () öğesini kullanmayı denedim, ancak koleksiyon modelinde mevcut değildi.
Paul

Yanıtlar:


52

Aşağıdaki toplama yöntemini kullanarak belirsiz herhangi bir durumu kolayca çözebilirsiniz:

  • addFilterToMap($filterName, $alias, $group = 'fields')
    • $filter- Bu addFieldToFilter()yöntemde kullanılan filtrenin adı, sizin durumunuz içinincrement_id
    • $alias- Süzgeç ile ilişkilendirilen sütunun tam adı, sizin durumunuz için main_table.increment_id.
    • $group - Koleksiyondaki her türlü bilgi için bir harita olması gerekiyordu, fakat şimdilik sadece filtrelerde kullanılıyor, bu nedenle bu argümanı atlayabilirsiniz.

Ayrıca, bir etkinlik gözlemlemediğiniz sürece, Load’un katılımlarınızı yerleştirmek için doğru yer olduğunu sanmıyorum. Senin durumunda daha _initSelect()önce arayarak ile yönteme taşımak daha iyidir parent::_initSelect(). Birleştirme çakışmalarını çözmek için addFilterToMap()yönteminizin içindeki yöntemi çağırabilirsiniz _initSelect():

$this->addFilterToMap('increment_id', 'main_table.increment_id');

İlgi alanı dışında, neden _initSelect () içinde yer almak daha iyi?
Paul

@Paul _initSelecther zaman yalnızca bir kez çalıştırılır, bir defadan _beforeLoadfazla çağrılabilir, çünkü load()durumunu sıfırlarsanız birden fazla toplama yapabilirsiniz .
Ivan Chepurnyi,

@Paul de, _beforeLoad iki kez çağrılabildiğinden, ikinci aramada Zend_Db_Select'ten ölümcül bir hata alacaksınız.
Ivan Chepurnyi

2
Böyle bir şey yaptım: $collection = Mage::getModel("education/ticket") ->getCollection() ->addFilterToMap('updated_at', 'main_table.updated_at') ->addFilterToMap('created_at', 'main_table.created_at');
FosAvance 14:16

@ IvanChepurnyi, cömert. Magento 1 mimarı olarak mükemmel olduğunuzu gösterir
Amit Bera
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.