EC-CUBE4の商品一覧を販売件数順で並べ替える方法です。
最初に、管理画面>設定>システム設定>マスターデータ管理の「mtb_product_list_order_by」に販売件数順を追加してください。IDは4としてください。
次にCusotomizeディレクトリ内にRepositoryディレクトリを設置してください。
そして以下のようにProductOrderBySales.phpを作成してRepository内に設置してください。
<?php namespace Customize\Repository; use Eccube\Doctrine\Query\QueryCustomizer; use Eccube\Repository\QueryKey; use Doctrine\ORM\QueryBuilder; use Eccube\Repository\OrderItemRepository; /** * 販売件数順で並べ替えできるようにする * * 管理画面>設定>システム設定>マスターデータ管理の「mtb_product_list_order_by」で販売件数順を追加する。 * IDは4を設定 * * @author Akira Kurozumi <info@a-zumi.net> */ class ProductOrderBySales implements QueryCustomizer { protected $orderItemRepository; public function __construct(OrderItemRepository $orderItemRepository) { $this->orderItemRepository = $orderItemRepository; } public function customize(QueryBuilder $builder, $params, $queryKey) { if(!empty($params["orderby"]) && $params["orderby"]->getId() == 4) { //dtb_order_itemテーブルで商品件数を集計するサブクエリ $qb = $this->orderItemRepository->createQueryBuilder("oi") ->select("COUNT(oi.Product)") ->where("oi.Product = p.id") ->groupBy("oi.Product"); // 上記のサブクエリをselectに追加 $builder->addSelect(sprintf('(%s) AS HIDDEN total', $qb->getDql())) ->orderBy("total", "DESC"); } } public function getQueryKey(): string { return QueryKey::PRODUCT_SEARCH; } }
以上で完成です。