Sylius:如何通过variant.sku对产品进行排序

时间:2015-09-02 10:16:56

标签: sylius

我想通过它的sku对产品进行排序。怎么可能呢? 我尝试添加ProductRepository.php:

...
$queryBuilder = $this->getCollectionQueryBuilder();
    $queryBuilder
        ->innerJoin('product.taxons', 'taxon')
        ->innerJoin('product.variants', 'variant')
        ->andWhere('taxon = :taxon')
        ->setParameter('taxon', $taxon)
    ;

    foreach ($criteria as $attributeName => $value) {
        $queryBuilder
            ->andWhere('product.'.$attributeName.' IN (:'.$attributeName.')')
            ->setParameter($attributeName, $value)
        ;
    }
    $queryBuilder->orderBy('variant.sku');
...

但得到了:

  

无法使用LIMIT和ORDER BY从查询中选择不同的标识符   来自fetch的列加入了多个关联。使用输出   步行者。

2 个答案:

答案 0 :(得分:1)

最后我做了什么:在custom twig function输出之前对产品进行排序:

macros.html.twig

{% set products = skusort(products) %}

在我的 SkusortExtenstion.php (自PHP 5.3起)

$product->getIterator()->uasort(function($a, $b){
         return $a->getMasterVariant()->getSku() > $b->getMasterVariant()->getSku(); 
    });
return $product;

担心性能问题,因为有很多产品,但似乎非常快。

答案 1 :(得分:0)

另一种方法是重新加载类Sylius \ Bundle \ ResourceBundle \ Doctrine \ ORM \ EntityRepository的方法getPaginator()。在这种情况下,我们必须使用$ useOutputWalkers标志(最新的构造函数参数)即时通知DoctrineORMAdapter。

因此,将以下代码放在ProductRepository.php中:

/**
 * {@inheritdoc}
 */
public function getPaginator(QueryBuilder $queryBuilder)
{
    return new Pagerfanta(new DoctrineORMAdapter($queryBuilder, true, true));
}