Symfony2的学说从类别中获得随机产品(Symfony2 Doctrine get random

2019-09-15 23:24发布

我有以下的数据库模式:

table 'products'
id
category_id

当然还有一类表,只需用一个id。

数据看起来类似的东西:

Products
--------------------
| id | category_id |
--------------------
| 0  | 1           |
| 1  | 1           |
| 2  | 1           |
| 3  | 2           |
| 4  | 2           |
| 5  | 1           |
--------------------

我想选择一个类别(例如,第1类),所以我选择所有从我的产品的仓库类,类别行:

return $this
    ->createQueryBuilder('u')
    ->andWhere('u.category = :category')
    ->setMaxResults(1)
    ->setParameter('category', $category->getId())
    ->getQuery()
    ->getSingleResult()
;

如何我现在可以选择随机的产品? 另外:是否有可能通过关系来解决这个问题?

我有实体“类别”和“产品”之间的一对多的关系,所以我也可以通过类别 - 让所有的产品>的getProducts()...

任何帮助将是非常有用的,谢谢

Answer 1:

你首先要算的产品总数,然后生成一个随机偏移来选择一个随机的产品。

这应该让你开始:

$count = $this->createQueryBuilder('u')
             ->select('COUNT(u)')
             ->getQuery()
             ->getSingleScalarResult();

然后你就可以生成你的1和行的总数之间的随机数。

return $this->createQueryBuilder('u')
    ->where('u.category = :category')
    ->setFirstResult(rand(0, $count - 1))
    ->setMaxResults(1)
    ->setParameter('category', $category->getId())
    ->getQuery()
    ->getSingleResult()
;

翻译为:

SELECT * FROM products WHERE category_id = ? LIMIT 1, {random offset}


Answer 2:

使用这个辅助函数:

<?php
use Doctrine\ORM\EntityManager;

/**
 * Retrieve one random item of given class from ORM repository.
 * 
 * @param EntityManager $em    The Entity Manager instance to use
 * @param string        $class The class name to retrieve items from
 * @return object
 */ 
function getRandomDoctrineItem(EntityManager $em, $class)
{
    static $counters = [];
    if (!isset($counters[$class])) {
        $this->counters[$class] = (int) $this->manager->createQuery(
            'SELECT COUNT(c) FROM '. $class .' c'
        )->getSingleScalarResult();
    }
    return $em
        ->createQuery('SELECT c FROM ' . $class .' c ORDER BY c.id ASC')
        ->setMaxResults(1)
        ->setFirstResult(mt_rand(0, $counters[$class] - 1))
        ->getSingleResult()
    ;
}

实例:

$randomItem = getRandomDoctrineItem($em, 'Application\Entity\Post');


文章来源: Symfony2 Doctrine get random product from a category