使用CI2 + Doctrine2从数据库/实体获取随机记录

时间:2012-04-09 18:30:35

标签: doctrine-orm codeigniter-2

以下内容将返回带有Doctrine的随机记录:

$name = Doctrine::getTable('nametable')
->createQuery()
->select('name')
->orderBy('RAND()')
->fetchOne();

但是我正在运行CI2 + Doctrine2,所以它不起作用Call to undefined method Doctrine::getTable()

我试过

$data = $this->doctrine->em->getRepository('ORM\Project\Names')
                 ->orderBy('RAND()')
                 ->fetchOne();

但这也不起作用:Uncaught exception 'BadMethodCallException' with message 'Undefined method 'orderBy'. The method name must start with either findBy or findOneBy!'

也许findOneBy是我想要的,但它需要一个数组。

在此设置中是否有一种优雅的方式来获取随机记录?

修改

这就是我想出来的:

$query = $this->doctrine->em->createQuery("select max(u.id) from ORM\Dynasties2\Femalenames u");
$result = $query->getSingleResult();
$highval = $result[1];
$random_name = rand(1,$highval);
$name = $this->doctrine->em->find('ORM\Dynasties2\Femalenames', $random_name);
$mother_name = $name->getName();

当然有一种更清洁的方式???显然,CI2 / Doctrine2中没有RAND(),只有编写SQL查询。

2 个答案:

答案 0 :(得分:1)

当您尝试访问存储库时,

“orderBy”无效。在这种情况下,您必须使用“createQuery”或查询构建器“createQueryBuilder”进行查询。

另一种方式是:

$data = $this->doctrine->em->getRepository('ORM\Project\Names')->findOneBy(array(
    'field' => 'ASC or DESC'
));

在这里你可以测试RAND而不是ASC或DESC,但我认为最好的方法是进行查询。

您可以在存储库中定义一个函数,并在您的仓库中查询所有查询,而不是在控制器中,然后您的第一个示例看起来不错。

答案 1 :(得分:0)

这就是我想出来的:

$query = $this->doctrine->em->createQuery("select max(u.id) from ORM\Dynasties2\Femalenames u");
$result = $query->getSingleResult();
$highval = $result[1];
$random_name = rand(1,$highval);
$name = $this->doctrine->em->find('ORM\Dynasties2\Femalenames', $random_name);
$mother_name = $name->getName();

我认为还有另一种方法,但无法发现它。