2015-02-05 15 views
6

Tôi đang cố truy xuất một hàng ngẫu nhiên bằng CakePHP 3.0 RC-1, tôi đã xem xét the docs.Làm thế nào để có được một hàng ngẫu nhiên trong CakePHP 3.0?

Sử dụng những gì tôi có từ CakePHP 2.X và đặt đó làm điểm bắt đầu để nhận hàng ngẫu nhiên trong CakePHP 3.0 RC-1. Tuy nhiên, điều này dường như không làm điều đó cho Miss Cake:

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

Kết quả không có gì. Có dữ liệu trong cơ sở dữ liệu và tôi có thể truy xuất các bản ghi đơn. (Ie $ this-> Game-> get (20) hoạt động như nó cần).

+0

Làm việc tốt cho tôi ... làm thế nào chính xác là bạn thử nghiệm cho một kết quả (chỉ cần gỡ lỗi '$ result' sẽ không thực hiện các truy vấn)? ps, cũng thử với ảnh chụp nhanh gần đây. – ndm

+0

chỉ var_dump toàn bộ thực thể trò chơi $ trong Chế độ xem hoặc trong Trình điều khiển cho vấn đề đó. Đây là ảnh chụp nhanh dev gần đây nhất. – Coreus

+1

Có bạn có nó, những gì bạn đang làm là bán phá giá một truy vấn, không phải là một kết quả. Bạn sẽ phải thực sự tìm nạp thứ gì đó đầu tiên, ví dụ bằng cách sử dụng 'first()' (bạn có thể bỏ qua 'limit()' sau đó). Xem ** http: //book.cakephp.org/3.0/en/orm/query-builder.html#the-query-object** – ndm

Trả lời

8

Chỉ cần sử dụng "đầu tiên" để có được kết quả đầu tiên:

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

Ngoài ra, bạn có thể làm cho nó hoạt động như get() ở chỗ nó sẽ trả về một ngoại lệ nếu không có kết quả được tìm thấy:

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

Tác phẩm này hoạt động, nhưng hiệu quả như thế nào vì bạn không giới hạn? (Tìm tất cả các âm thanh như bạn đang nhận được một kết quả lớn và sau đó nhận được đầu tiên từ đó) – Coreus

+0

Sử dụng 'RAND()' luôn luôn là khủng khiếp, vì nó cần để có được tất cả các kết quả, đặt chúng ngẫu nhiên và sau đó cắt kết quả. Về câu hỏi của bạn, 'firstOrFail' sẽ áp dụng' LIMIT 1' cho bạn. Điều đó không có nghĩa là 'RAND()' sẽ hoạt động nhanh hơn. –

+0

Chắc chắn, nhưng sau đó một lần nữa bạn -can-kích hoạt bộ nhớ đệm truy vấn, hạn chế tác động. – Coreus

Các vấn đề liên quan