2012-04-09 13 views
0

隨機記錄下將返回一個隨機記錄與學說:從數據庫中獲得/實體使用CI2 + Doctrine2

$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查詢。

回答

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(); 

我認爲有另一種方式,但無法發現它。

+0

是的,這就是處理它的教義方式。你也可以使用這樣的功能:https://gist.github.com/Thinkscape/124d658e4076421c0516 – 2014-07-26 13:43:49

1

「orderBy」在您嘗試訪問存儲庫時不起作用。在這種情況下,您必須使用「createQuery」或查詢構建器「createQueryBuilder」進行查詢。

另一種方法是:

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

在這裏,您可以測試RAND而不是ASC或DESC,但我認爲最好的辦法是進行查詢。

您可以定義在你的倉庫的功能,讓你在你的回購所有querys,而不是在你的控制器那麼你的第一個例子看起來不錯的查詢。