2012-04-09 8 views
0

Die im Anschluss an die eine Zufallsaufzeichnung mit Lehre zurückkehren würde:Erhalten Sie einen zufälligen Datensatz aus der Datenbank/Einheit mit CI2 + Doctrine2

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

Aber ich bin mit CI2 + Doctrine2, und so funktioniert es nicht Call to undefined method Doctrine::getTable()

ich habe

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

Aber das funktioniert auch nicht: Uncaught exception 'BadMethodCallException' with message 'Undefined method 'orderBy'. The method name must start with either findBy or findOneBy!'

Vielleicht findOneBy ist was ich will, aber es erwartet ein Array.

Gibt es eine elegante Möglichkeit, einen zufälligen Datensatz in diesem Setup abzurufen?

Edit:

Dies ist, was ich habe kommen mit:

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

Sicherlich gibt es einen sauberen Weg ??? Anscheinend gibt es in CI2/Doctrine2 keine RAND(), nur um eine SQL-Abfrage zu schreiben.

Antwort

0

Dies ist, was ich habe kommen mit:

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

Ich nahm es einen anderen Weg, aber es nicht entdecken.

+0

Ja, das ist die Doktrin Art, damit umzugehen. Sie können auch eine Funktion wie folgt verwenden: https://gist.github.com/Thinkscape/124d658e4076421c0516 –

1

"orderBy" funktioniert nicht, wenn Sie versuchen, auf das Repository zuzugreifen. In diesem Fall müssen Sie eine Abfrage mit "createQuery" oder dem Abfrage-Generator "createQueryBuilder" erstellen.

Der andere Weg ist:

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

Hier können Sie RAND statt ASC oder DESC testen können, aber ich denke, der beste Weg, um eine Abfrage zu machen.

Sie können eine Funktion in Ihrem Repository definieren und eine Abfrage durchführen, dass Sie alle Abfragen in Ihrem Repo und nicht in Ihrem Controller haben, dann sieht Ihr erstes Beispiel gut aus.

Verwandte Themen