学习新知识, 或者仅仅是因为我们需要从数据库中的表中选择随机项目, 记录, 而我们又没有时间实现新的Doctrine函数(在这种情况下, Rand在dql中并没有实现), 如果我们不使用正确的功能, 任务可能会变得棘手。
在mySql中, 你可以使用以下代码轻松地从表中选择随机行:
SELECT column FROM table
ORDER BY RAND()
LIMIT 10
但是, 如果你使用DQL(Doctrine查询语言), 这将不是那么容易。根据文档, 你可以实现一个学说扩展并将RAND指令添加到我们的查询中(在本文中, 由于这是另一个历史和另一个令人头疼的问题, 我们将不处理此问题), 但是我们仅需通过几个操作就可以轻松, 快速地解决此问题。而是将整个类添加到我们的项目中。
对于我们的解决方案, 我们将使用where IN语句, 并且仅按某个术语进行搜索(在这种情况下, 为ID或任何自动增量字段, 如果你的表没有具有自动增量主键的表, 则必须从主义中实现RAND扩展)根据随机数使用简单的php函数。
在此示例中, 我们将使用的表将具有一个称为id的自动递增字段(具有数字值…), 要检索随机记录, 我们需要首先创建一个返回给定范围内的随机数(起始值)的函数。 (最大值和数量), 如下所示:
function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
$numbers = range($min, $max);
shuffle($numbers);
return array_slice($numbers, 0, $quantity);
}
UniqueRandomNumbersWithinRange将为我们提供给定范围之间的随机数, 这些数字将用于使用以下原则搜索表中的随机行:
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository('mybundleBundle:TableName');
$quantity = 5; // We only want 5 rows (however think in increase this value if you have previously removed rows on the table)
// This is the number of rows in the database
// You can use another method according to your needs
$totalRowsTable = $repo->createQueryBuilder('a')->select('count(a.id)')->getQuery()->getSingleScalarResult();// This will be in this case 10 because i have 10 records on this table
$random_ids = UniqueRandomNumbersWithinRange(1, $totalRowsTable, $quantity);
// var_dump($random_ids);
// outputs for example:
// array(1, 5, 2, 8, 3);
$random_articles = $repo->createQueryBuilder('a')
->where('a.id IN (:ids)') // if is another field, change it
->setParameter('ids', $random_ids)
->setMaxResults(3)// Add this line if you want to give a limit to the records (if all the ids exists then you would like to give a limit)
->getQuery()
->getResult();
先前的代码结构非常简单, WHERE IN将匹配$ random_ids(数组)中id所在的行。如果需要, 你可以更改该方法以获取数据库中的行总数(或根据表的使用获取最后一个寄存器的ID)。最重要的部分是在线的位置, 你可以在实施完整的解决方案之前使用随机数进行测试以查看其是否有效。玩得开心 !
评论前必须登录!
注册