Vấn đề sử dụng trên mạng có bộ sưu tập Magento


20

Tôi đang cố gắng xây dựng một bộ sưu tập tùy chỉnh cho lưới trong mô-đun quản trị Magento. Tôi đã tạo ra một phương thức bộ sưu tập mới gọi là "addAttributionHaving" để thực hiện như sau:

public function addAttributeHaving($value)
{
    $this->getSelect()->having($value);
    return $this;
}

Xem mã bộ sưu tập:

$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);

Điều này tạo ra SQL sau đây thực thi hoàn toàn tốt và tạo ra kết quả mong đợi khi chạy bên ngoài 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)

Tuy nhiên, khi tôi cố tải lưới bên trong Magento, tôi gặp lỗi sau:

SQLSTATE [42S22]: Không tìm thấy cột: 1054 Cột không xác định 'DIF_AU' trong 'có mệnh đề'

Ngoài ra, nếu tôi loại bỏ mệnh đề có (phá vỡ kết quả của tôi), tôi có thể sử dụng cột DIF_AU cho nguồn dữ liệu trong Lưới.


1
CẬP NHẬT: Tôi đã có thể theo dõi vấn đề đối với phương thức getSelectCountSql () gốc. Đây thực sự là nơi vấn đề đang xảy ra khi cố gắng để có được số lượng bộ sưu tập.
Anthony Leach Jr

1
Gửi một câu trả lời! WTH sd_order_typeđến từ đâu?
đánh dấu

1
Bí mật loại thứ tự tùy chỉnh hàng đầu đã được thêm vào bảng phẳng. Tôi vẫn đang làm việc ra câu trả lời.
Anthony Leach Jr

1
"Người dùng có ít hơn 10 danh tiếng không thể trả lời câu hỏi của chính họ trong 8 giờ sau khi hỏi. Bạn có thể trả lời trong 7 giờ. Cho đến lúc đó, vui lòng sử dụng nhận xét hoặc chỉnh sửa câu hỏi của bạn." (giải pháp đến trong 7 giờ).
Anthony Leach Jr

1
Một người nào đó cho người đàn ông này một upvote
đánh dấu

Câu trả lời:


12

Tôi sẽ thực sự trả lời câu hỏi của riêng tôi ở đây. Tôi biết, khó khăn, nhưng tôi vấp phải câu trả lời khi nhìn gần hơn vào dấu vết ngăn xếp thực tế. Bộ sưu tập đang tải tốt, tuy nhiên, sự cố xảy ra muộn hơn một chút khi chúng ta cố gắng lấy số lượng bộ sưu tập trong Varien_Data_Collection_Db :: getSelectCountSql () . SQL được tạo ra từ đây là:

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)

Bạn sẽ nhận thấy rằng câu lệnh HAVING được đính kèm nhưng chúng tôi không còn định nghĩa cho cột DIF_AU nữa. Dường như tôi sẽ cần phải mở rộng một getSelectCountSql () tùy chỉnh trong lớp bộ sưu tập của mình để có được số lượng bản ghi đúng.

Tôi đã tạo một getSelectCountSql () mở rộng trong lớp bộ sưu tập tùy chỉnh bổ sung trở lại trong cột bị thiếu cần thiết cho câu lệnh có.


public function getSelectCountSql()
  {
    $countSelect = parent::getSelectCountSql();
    $countSelect->columns('grand_total - sum(sfop.amount_authorized) AS DIF_AU');
    $countSelect->reset(Zend_Db_Select::GROUP);
    return $countSelect;
  }

1
Không khó khăn gì cả nếu bạn tìm ra giải pháp trước, điều đó được khuyến khích. Những người khác có khả năng sẽ tìm thấy nó hữu ích xuống đường. +1 :)
davidalger

Bạn nên nộp báo cáo lỗi! magentoc Commerce.com/orms-tracking
benmark

Đây là một vấn đề tôi cũng đã thấy, và thực hiện tốt việc tìm câu trả lời. Tuy nhiên, tôi không nghĩ rằng giải pháp của bạn là chính xác - bởi vì bạn đang sử dụng nhóm theo, SelectCountSql của bạn cần phải trả về số lượng nhóm. Vì vậy, bạn cần một số đếm (fetch ALL ()) hoặc để viết lại truy vấn của bạn bằng cách sử dụng count(distinct main_table.entity_id)thay vìcount(*)
Benubird

Tôi nghĩ bạn rất có thể đúng. Dự án này đã được ghi lại từ bài đăng này, và bây giờ trở lại với nó. Trong một bản demo tuần trước, tôi nhận thấy số lượng hồ sơ không chính xác được báo cáo trong lưới. Sẽ báo cáo lại những phát hiện của tôi khi tôi đã giải quyết nó.
Anthony Leach Jr

@AnthonyLeachJr có tin tức gì về phát hiện của bạn không?
Simon

0

Trước hết $countSelect->reset(Zend_Db_Select::HAVING);có nghĩa là nó sẽ thiết lập lại HAVINGtừ bộ sưu tập của bạn. Điều đó có nghĩa là nó sẽ loại bỏ mệnh đề có. Và nó không phải là những gì bạn muốn. Bạn có thể muốn thêm nó vào bộ sưu tập ( app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php->_getSelectCountSql()ở đây.)

Nhưng thủ phạm chính là getSize()phương thức tồn tại trong lib/Varien/Data/Collection/Db.phptệp.

Tôi đã thử giải pháp trên được đề cập bởi @Anthony nhưng không được.

Bây giờ tôi đã làm như dưới đây.

public function getSize()
{
    if (is_null($this->_totalRecords)) {
        //$sql = $this->getSelectCountSql();
        $sql = $this->getSelect();
        $this->_totalRecords = count($this->getConnection()->fetchAll($sql, $this->_bindParams));
    }
    return intval($this->_totalRecords);
}

Kiểm tra tôi thậm chí không sử dụng getSelectCountSql(). Tôi chỉ đọc toàn bộ SQL QUERYtìm nạp tất cả dữ liệutrả về số lượng của nó. Đó là tất cả.


0

Tôi đã khắc phục sự cố này tại đây: app / code / core / Mage / Catalog / Model / Resource / Product / Collection.php: 943 add this: $ select-> reset (Zend_Db_Select :: HAVING);

Chỉ cần sao chép ứng dụng / mã / lõi / Pháp sư / Danh mục / Mô hình / Tài nguyên / Sản phẩm / Bộ sưu tập.php sang ứng dụng / mã / cục bộ / Mage / Danh mục / Mô hình / Tài nguyên / Sản phẩm / Bộ sưu tập.php

Mã của tôi trông như thế này:

/**
 * Build clear select
 *
 * @param Varien_Db_Select $select
 * @return Varien_Db_Select
 */
protected function _buildClearSelect($select = null)
{
    if (is_null($select)) {
        $select = clone $this->getSelect();
    }
    $select->reset(Zend_Db_Select::ORDER);
    $select->reset(Zend_Db_Select::LIMIT_COUNT);
    $select->reset(Zend_Db_Select::LIMIT_OFFSET);
    $select->reset(Zend_Db_Select::COLUMNS);
    $select->reset(Zend_Db_Select::HAVING);

0

Giải pháp này sẽ hoạt động nếu lựa chọn của bạn có tên cột duy nhất vì bất kỳ cột nào trong danh sách chọn truy vấn phụ phải có tên duy nhất

Subquery: subquery cho phép trùng lặp tên cột

public function getSelectCountSql()
{
    $this->_renderFilters();
    $select = clone $this->getSelect();
    $select->reset(Zend_Db_Select::ORDER);
    $select->reset(Zend_Db_Select::LIMIT_COUNT);
    $select->reset(Zend_Db_Select::LIMIT_OFFSET);        

    $countSelect = clone $this->getSelect();
    $countSelect->reset();
    $countSelect->from(array('a' => $select), 'COUNT(*)');
    return $countSelect;
}

PS: Câu trả lời này dành cho các bộ sưu tập magento nói chung. không liên quan đến chỉ bộ sưu tập sản phẩm.


0

Đây là làm việc

Hàm công khai getSize () {if (is_null ($ this -> _ totalRecords)) {// $ sql = $ this-> getSelectCountSql (); $ sql = $ this-> getSelect (); $ this -> _ totalRecords = Count ($ this-> getConnection () -> fetch ALL ($ sql, $ this -> _ bindParams)); } return intval ($ this -> _ TotalRecords); }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.