Domanda

Ho il seguente collezione che aiuta a realizzare un rapporto personalizzato.

<?php


class VMR_Customreports_Model_Resource_Productsordered_Collection
    extends Mage_Reports_Model_Resource_Order_Collection
{
    public function __construct()
    {
        parent::__construct();
        $this->_init('sales/order_item');
    }

    public function setDateRange($from, $to)
    {
        $this->_reset();
        $this->getSelect()
            ->joinInner(
                array('i' => $this->getTable('sales/order_item')),
                'i.`order_id` = main_table.`entity_id`'
            )
            ->where("main_table.created_at BETWEEN '" . $from . "' AND '" . $to . "'")
            ->where('main_table.status != \'canceled\'')
            ->where('main_table.customer_email NOT LIKE \'%@v2cigs.%\'')
            ->where('i.parent_item_id IS NULL')
            ->columns(array(
                'myname' => 'i.name',
                'ordered_qty' => 'sum(i.qty_ordered)',
                'ordered_money' => 'sum(i.`price`*i.qty_ordered)'))
            ->group('i.name');

        return $this;
    }

    public function setStoreIds($storeIds)
    {
        if ($storeIds)
            $this->addAttributeToFilter('i.store_id', array('in' => (array)$storeIds));

        return $this;
    }

}

Quando faccio il login come amministratore completo, seleziona i dati giusti, ma quando faccio il login come utente più ristretto ottengo un errore circa, "Integrità violazione di vincolo: 1052 colonna 'STORE_ID' in cui la clausola è ambiguo".
Posso capire che si sta parlando di essere presenti STORE_ID sia nella tabella order_item e nella tabella di ordine, ma sto specificando il tavolo per tirare da quando si utilizza store_id.

Inoltre, l'errore si verifica proprio al join. Se io commento il codice STORE_ID ho ancora ottenere l'errore. Perché?

È stato utile?

Soluzione

Se si utilizza l'Enterprise Edition, il modulo AdminGws sta applicando filtri negozio di ambito così gli amministratori sono solo in grado di accedere ai dati che sono autorizzati a vedere.

Inoltre, probabilmente si desidera rimuovere il metodo __construct(). Vedi sotto per alcune informazioni aggiuntive.

Sfondo:

Si stanno estendendo da Mage_Reports_Model_Resource_Order_Collection. Questa classe viene utilizzata la tabella sales/order (che è, sales_flat_order come la tabella principale.

 $this->getSelect()->from(array('main_table' => $this->getMainTable()));

La tabella principale è in realtà prelevati dal modello di risorse associati:

public function getMainTable()
{
    if ($this->_mainTable === null) {
        $this->setMainTable($this->getResource()->getMainTable());
    }

    return $this->_mainTable;
}

Quindi, il modello di risorse è responsabile di fornire il nome della tabella principale.
Mage::getResourceModel($this->getResourceModelName()) viene utilizzato per raccogliere il modello di risorse.
Così che cosa ritorno getResourceModelName()?
Restituisce il valore che è stato impostato dalla chiamata _init().

protected function _init($model, $resourceModel = null)
{
    $this->setModel($model);
    if (is_null($resourceModel)) {
        $resourceModel = $model;
    }
    $this->setResourceModel($resourceModel);
    return $this;
}

Nella classe, si sta ignorando l'invito _init() della classe padre:

$this->_init('sales/order_item');

In effetti, si specifica che la vostra collezione deve utilizzare il modello di risorse articolo dell'ordine, che restituirà la sales/order_item tabella come la tabella principale.
A causa della vostra chiamata _init() si stanno unendo la tabella sales_flat_order_item con se stesso.
Fissaggio che, eliminando la chiamata _init(), o di fatto l'intera sostituzione __construct(), probabilmente risolvere questo problema per voi.

Altri suggerimenti

Se faccio questo:

public function addStoreAttributeToFilter($collection)
{
    if($collection->getModelName() == 'sales/order' || $collection->getModelName() == 'sales/order_item')
    {
        $collection->addFieldToFilter('main_table.store_id', array('in' => $this->_role->getStoreIds()));
    }
    else
    {
        $collection->addAttributeToFilter('store_id', array('in' => $this->_role->getStoreIds()));
    }
}

in AdminGws / Modello / Collections.php

e nella mia collezione creare un costruttore che fa $ this -.> _ Init ( 'vendite / order_item') che funziona

La parte costruttore non ha senso per me, ma mi chiederà di quella parte.

Oggi ho affrontato un problema simile. Accensione $_logAllQueries come @Vinai suggerito mostrato che Enterprise_AdminGws filtrava la mia collezione per store_id. Ho sistemato aggiungendo:

$collection->addFilterToMap('store_id', 'main_table.store_id');

appena prima del $this->setCollection($collection);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top