2015-02-05 12 views
6

Sto provando a recuperare una riga casuale con CakePHP 3.0 RC-1, ho esaminato the docs.Come posso ottenere una riga casuale in CakePHP 3.0?

Utilizzare quello che avevo da CakePHP 2.X e metterlo come punto di partenza per ottenere una riga casuale in CakePHP 3.0 RC-1. Tuttavia, questo a quanto pare non lo fa per Miss Cake:

$result = $this->Game->find('all') 
      ->order('rand()') 
      ->limit(1); 

Il risultato non produce nulla. Vi sono dati nel database e sono in grado di recuperare singoli record. (I.e $ this-> Game-> get (20) funziona come dovrebbe).

+0

Funziona bene per me ... esattamente come stai testando un risultato (solo il debug di '$ result' non eseguirà la query)? ps, prova anche con una recente snapshot di sviluppo. – ndm

+0

basta var_dump per l'intera entità di gioco $ in Visualizza o nel Controller. Questa è la più recente snapshot di sviluppo. – Coreus

+1

Ce l'hai, quello che stai facendo è il dumping di una query, non un risultato. Dovrai effettivamente recuperare qualcosa prima, ad esempio usando 'first()' (puoi eliminare il 'limit()' then). Vedi ** http: //book.cakephp.org/3.0/en/orm/query-builder.html#the-query-object** – ndm

risposta

8

Basta usare "prima" per ottenere il primo risultato:

$result = $this->Game->find('all') 
     ->order('rand()') 
     ->first(); 

In alternativa, è possibile farlo funzionare come get() in che restituisca un'eccezione se non vengono trovati risultati:

$result = $this->Game->find('all') 
     ->order('rand()') 
     ->firstOrFail(); 
+0

Funziona, ma quanto è efficiente dal momento che non stai limitando? (Trova tutto come se si stesse ottenendo un grande set di risultati e poi ottenere il primo da quello) – Coreus

+0

L'uso di 'RAND()' è sempre orribile, in quanto ha bisogno di ottenere tutti i risultati, ordinarli casualmente e quindi tagliare i risultati. Per quanto riguarda la tua domanda, 'firstOrFail' applicherà un' LIMIT 1' per te. Ciò non significa che 'RAND()' si esibirà più velocemente, però. –

+0

Certo, ma poi puoi -can- attivare il caching delle query, limitando l'impatto. – Coreus