Saya mencoba membangun koleksi khusus untuk kisi-kisi di modul admin Magento. Saya telah membuat metode pengumpulan baru yang disebut "addAttributeHaving" yang hanya melakukan hal berikut:
public function addAttributeHaving($value)
{
$this->getSelect()->having($value);
return $this;
}
Lihat kode koleksi:
$collection->addFieldToSelect(
array(
'entity_id',
'created_at',
'increment_id',
'customer_email',
'customer_firstname',
'customer_lastname',
'grand_total',
'status'
)
);
$collection->getSelect()->joinLeft(array('sfop' => 'sales_flat_order_payment'), 'main_table.entity_id = sfop.parent_id', 'sfop.amount_authorized');
$collection->getSelect()->columns('sum(sfop.amount_authorized) AS AUTHD');
$collection->getSelect()->columns('grand_total - sum(sfop.amount_authorized) AS DIF_AU');
$collection->addFieldToFilter('main_table.state', array('in' => array('new','payment_review')));
$collection->addFieldToFilter('main_table.sd_order_type', array('neq' => 7));
$collection->addFieldToFilter('sfop.method', array('neq' => 'giftcard'));
$collection->addFieldToFilter('main_table.created_at', array('gt' => $this->getFilterDate()));
$collection->getSelect()->group(array('main_table.entity_id'));
$collection->addAttributeHaving('DIF_AU <> 0');
$collection->load(true,true);
$this->setCollection($collection);
Ini menghasilkan SQL berikut yang dieksekusi dengan sangat baik dan menghasilkan hasil yang diharapkan ketika dijalankan di luar Magento.
[METHOD=Varien_Data_Collection_Db->printLogQuery] SELECT `main_table`.`entity_id`, `main_table`.`entity_id`, `main_table`.`created_at`, `main_table`.`increment_id`, `main_table`.`customer_email`, `main_table`.`customer_firstname`, `main_table`.`customer_lastname`, `main_table`.`grand_total`, `main_table`.`status`, `sfop`.`amount_authorized`, sum(sfop.amount_authorized) AS `AUTHD`, grand_total - sum(sfop.amount_authorized) AS `DIF_AU` FROM `sales_flat_order` AS `main_table` LEFT JOIN `sales_flat_order_payment` AS `sfop` ON main_table.entity_id = sfop.parent_id WHERE (main_table.state in ('new', 'payment_review')) AND (main_table.sd_order_type != 7) AND (sfop.method != 'giftcard') AND (main_table.created_at > '2013-04-07') GROUP BY `main_table`.`entity_id` HAVING (DIF_AU <> 0)
Namun, ketika saya mencoba memuat kotak di dalam Magento saya mendapatkan kesalahan berikut:
SQLSTATE [42S22]: Kolom tidak ditemukan: 1054 Kolom tidak dikenal 'DIF_AU' di 'memiliki klausa'
Selain itu, jika saya menghapus klausa memiliki (yang merusak hasil saya), saya dapat menggunakan kolom DIF_AU untuk sumber data di Grid.
sumber
sd_order_type
berasal?Jawaban:
Saya benar-benar akan menjawab pertanyaan saya sendiri di sini. Saya tahu, norak, tetapi saya menemukan jawabannya ketika melihat lebih dekat pada jejak tumpukan yang sebenarnya. Koleksi ini memuat baik-baik saja, namun kegagalannya muncul sedikit lebih lambat ketika kami mencoba mendapatkan jumlah koleksi di Varien_Data_Collection_Db :: getSelectCountSql () . SQL yang dihasilkan dari ini adalah:
SELECT COUNT(*) FROM sales_flat_order AS main_table LEFT JOIN sales_flat_order_payment AS sfop ON main_table.entity_id = sfop.parent_id WHERE (main_table.state in ('payment_review')) AND (main_table.sd_order_type != 7) AND (sfop.method != 'giftcard') AND (main_table.created_at > '2013-04-07') GROUP BY main_table.entity_id HAVING (DIF_AU <> 0)
Anda akan melihat bahwa pernyataan HAVING terlampir namun kami tidak memiliki definisi untuk kolom DIF_AU lagi. Tampaknya saya perlu memperpanjang getSelectCountSql () kustom di kelas koleksi saya untuk mendapatkan jumlah catatan yang tepat.
Saya telah membuat getSelectCountSql () yang diperluas di kelas koleksi khusus yang menambahkan kembali di kolom yang hilang yang diperlukan untuk pernyataan memiliki.
sumber
count(distinct main_table.entity_id)
bukancount(*)
Pertama-tama
$countSelect->reset(Zend_Db_Select::HAVING);
berarti itu akan diatur ulangHAVING
dari koleksi Anda. Itu berarti akan menghapus klausa yang memiliki. Dan bukan itu yang Anda inginkan. Anda mungkin ingin menambahkannya ke koleksi (diapp/code/core/Mage/Catalog/Model/Resource/Product/Collection.php->_getSelectCountSql()
sini.)Namun penyebab utamanya adalah
getSize()
metode yang ada dalamlib/Varien/Data/Collection/Db.php
file.Sekarang saya lakukan di bawah ini.
Periksa saya bahkan tidak menggunakan
getSelectCountSql()
. Saya hanya membaca seluruh QUERY SQL dan mengambil semua data dan mengembalikannya . Itu saja.sumber
Saya memperbaiki masalah ini di sini: app / code / core / Mage / Katalog / Model / Sumber Daya / Produk / Collection.php: 943 tambahkan ini: $ select-> reset (Zend_Db_Select :: HAVING);
Cukup salin aplikasi / kode / inti / Penyihir / Katalog / Model / Sumber Daya / Produk / Collection.php ke aplikasi / kode / lokal / Penyihir / Katalog / Model / Sumber Daya / Produk / Collection.php
Kode saya terlihat seperti ini:
sumber
Subquery: subquery tabel memungkinkan nama kolom duplikat
sumber
Ini bekerja
fungsi publik getSize () {if (is_null ($ this -> _ totalRecords)) {// $ sql = $ this-> getSelectCountSql (); $ sql = $ this-> getSelect (); $ this -> _ totalRecords = count ($ this-> getConnection () -> fetchAll ($ sql, $ this -> _ bindParams)); } mengembalikan intval ($ this -> _ totalRecords); }
sumber