2015-02-05 4 views
6

CakePHP 3.0 RC-1로 임의의 행을 검색하려고하는데, the docs을 조사했습니다.CakePHP 3.0에서 임의의 행을 얻으려면 어떻게해야합니까?

CakePHP 2.X에서 사용한 것을 사용하여 CakePHP 3.0 RC-1에서 임의의 행을 얻는 출발점으로 두었습니다. 그러나 이것은 미스 케잌에게 분명히 나타나지 않습니다.

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

결과는 아무 것도 산출되지 않습니다. 데이터베이스에 데이터가 있으며 단일 레코드를 검색 할 수 있습니다. (필자는 $ this-> Game-> get (20)과 같이해야한다).

+0

나를 위해 잘 작동 ... 정확하게 결과를 테스트하는 (그냥'$ 결과'디버깅 쿼리를 실행하지 않습니다)? ps, 또한 최근의 dev 스냅 샷으로 시도하십시오. – ndm

+0

그 문제에 대해 View 또는 컨트롤러에서 전체 $ game 엔티티를 var_dump하십시오. 이것은 가장 최근의 dev 스냅 샷입니다. – Coreus

+1

그곳에는 쿼리가 덤핑되어 있습니다. 결과가 아닙니다. 예를 들어'first()'를 사용하여 실제로 무엇인가를 가져와야합니다 ('limit() '을 그 때 빼낼 수 있습니다). ** http : //book.cakephp.org/3.0/en/orm/query-builder.html#the-query-object** – ndm

답변

8

그냥 "최초의"첫 번째 결과 얻기를위한 사용 : 어떤 결과를 찾을 수없는 경우 또는

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

을, 당신은 예외가 반환에서이 get()처럼 작동 할 수 있습니다 :

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

이 방법이 효과적이지만 제한적이지 않으므로 얼마나 효율적입니까? – Coreus

+0

'RAND()'를 사용하는 것은 모든 결과를 얻고, 무작위로 정렬 한 다음, 결과를 조각 내야하므로 항상 끔찍합니다. 귀하의 질문에 관해서,'firstOrFail'은 당신에게'LIMIT 1'을 적용 할 것입니다. 그렇다고해서'RAND()'가 더 빨리 수행된다는 것을 의미하지는 않습니다. –

+0

물론 그렇지만 다시 쿼리 캐싱을 트리거하여 영향을 제한 할 수 있습니다. – Coreus

관련 문제