Nếu trong _prepareCollection
của bạn phương pháp tôi in truy vấn qua:
echo $collection->getSelect()->assemble();
Tôi nhận được cái này:
SELECT
`main_table`.*,
group_concat(sales_flat_shipment_track.track_number SEPARATOR ",") AS `track_number`,
group_concat(sales_flat_shipment_track.title SEPARATOR ",") AS `title`
FROM `sales_flat_order_grid` AS `main_table`
INNER JOIN `sales_flat_shipment_track`
ON main_table.entity_id = sales_flat_shipment_track.order_id
Bằng cách truy vấn này, tôi sẽ luôn nhận được một kết quả, ngay cả một hàng "trống" khi không có đơn đặt hàng nào trên bảng. Đúng hơn, tôi nghĩ những gì bạn đang cố gắng đạt được có thể được thực hiện bằng cách sử dụng các truy vấn con:
SELECT
`main_table`.*,
(
SELECT
group_concat(`t`.`track_number` SEPARATOR ",") AS `track_number`
FROM `sales_flat_shipment_track` AS `t`
WHERE `main_table`.`entity_id` = `t`.`order_id`
),
(
SELECT
group_concat(`t`.`title` SEPARATOR ",") AS `title`
FROM `sales_flat_shipment_track` as `t`
WHERE `main_table`.`entity_id` = `t`.`order_id`
)
FROM `sales_flat_order_grid` AS `main_table`;
Vì vậy, để dịch nó cho Magento, nó sẽ trông giống như sau:
protected function _prepareCollection()
{
$collection = Mage::getResourceModel('sales/order_grid_collection');
$collection->getSelect()
->from(
array(),
array(
'track_number' => new Zend_Db_Expr('(
SELECT GROUP_CONCAT(`t`.`track_number` SEPARATOR ",")
FROM `sales_flat_shipment_track` as `t`
WHERE `main_table`.`entity_id` = `t`.`order_id`
)'),
'title' => new Zend_Db_Expr('(
SELECT GROUP_CONCAT(`t`.`title` SEPARATOR ",")
FROM `sales_flat_shipment_track` as `t`
WHERE `main_table`.`entity_id` = `t`.`order_id`
)'),
)
);
$this->setCollection($this);
return parent::_prepareCollection();
}
Đối với quan điểm của bạn về các tiêu đề nhà cung cấp dịch vụ trùng lặp, điều đó được mong đợi trong trường hợp như thế này. Cách duy nhất để giải quyết vấn đề này là thêm DISTINCT
từ trong truy vấn phụ cho tiêu đề, như sau:
SELECT GROUP_CONCAT(DISTINCT `t`.`title` SEPARATOR ",")
Nhưng tôi không chắc bạn định làm gì với dữ liệu này trong lưới. Hy vọng điều đó sẽ hữu ích.