0

以下将返回带有 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 查询。

4

2 回答 2

1

当您尝试访问存储库时, “orderBy”不起作用。在这种情况下,您必须使用 "createQuery" 或查询构建器"createQueryBuilder"进行查询。

另一种方式是:

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

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

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

于 2012-04-09T18:41:48.480 回答
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();

我以为还有另一种方法,但找不到。

于 2012-04-10T17:40:52.167 回答