0

我目前在产品和与产品相关的多个交易(总共 100 万笔交易的表)之间有一个简单的一对多关系。

我正在尝试做的是遍历前 10 名产品并选择与该产品相关的顶级交易。

在教义 2 中实现这一目标的最佳方法是什么?我正在考虑在产品实体中添加诸如 getTopDeals 之类的方法,然后在遍历每个产品时在 twig 中调用它,如下所示:

{% for product in popular_products %}
    {% set deal = product.getTopDeal() %}
    {{ product.title }} - {{ deal.title }}, {{deal.price }}
{% endfor %}

但是,我读过通常不赞成将诸如此类的方法添加到模型中,因此我不知道最好的方法是什么。

4

2 回答 2

2

在您的 Deals 存储库中创建一个方法来接受参数并返回 topdeal。在您的控制器中, array_map() 您的产品以生成由产品键入的一系列交易。然后将交易数组与您的产品数组一起传递给您的模板。

编辑:要求的样品:

存储库:

public function getTopDealProduct($productid)
{
    $em=$this->getEntityManager();
    $qb = $em->getRepository('Bundle:Deal')->createQueryBuilder('d');
    $qb->join('d.product', 'p');
    $qb->setMaxResults(1);
    $qb->addOrderBy('d.price');
    $query = $qb->getQuery();
    $results = $query->getResult();

    return $results;
}

控制器:

public function s2JUsorAction(Request $request, $id)
{
    $dealrep = $this->em->getRepository('Bundle:Deal');
    $prodrep = $this->em->getRepository('Bundle:Product');
    $products= $prodrep->getProducts();  // Not shown here, write this
    $deals= array_map(function($element) use ($dealrep){
         return $dealrep->getTopDealProduct($element->getId());
    }
    ,$products);


    return $this->render('Bundle:Product:Deal.html.twig', array(
        'products'  => $products
       ,'deals'     => $deals
    ));
}
于 2013-01-30T16:56:32.110 回答
1

最佳实践是“胖模型,瘦控制器”。如果模型本身能够进行这种过滤,例如,为产品选择最高交易的逻辑肯定在模型中占有一席之地。它只需要与它有关系的交易对象。为此,您可以使用Criteria API,例如:

use Doctrine\Common\Collections\Criteria;
class Product {
    private $deals; // many-to-many to Products

    public function getTopDeals() {
        $criteria = Criteria::create()->orderBy(array('price', 'DESC'))->setMaxResults(10);
        return $this->deals->matching($criteria);
    }
}

如果选择逻辑更复杂,并且需要进入实体管理器,那么它更适合放置在 EntityRepository 上。

于 2013-01-30T22:19:46.740 回答