2015-02-05 77 views
6

我試圖檢索與CakePHP 3.0 RC-1隨機行,我已經看着the docs如何在CakePHP 3.0中獲得一個隨機行?

使用CakePHP 2.X中的內容,並將其作爲獲取CakePHP 3.0 RC-1中隨機行的起點。然而,這顯然不適用於Miss Cake:

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

結果什麼都沒有。數據庫中有數據,我可以檢索單個記錄。 (I.e $ this-> Game-> get(20)像它應該那樣工作)。

+0

對我來說工作得很好......你究竟如何測試一個結果(只是調試'$ result'不會執行查詢)? ps,也可以嘗試使用最近的開發快照。 – ndm 2015-02-05 16:00:04

+0

只是var_dump View中或控制器中的整個$遊戲實體。這是最新的開發快照。 – Coreus 2015-02-05 16:03:11

+1

你有它,你正在做的是傾銷一個查詢,而不是結果。你必須首先實際獲取某些東西,例如通過使用first()(然後你可以拋棄'limit()')。請參閱** http://book.cakephp.org/3.0/en/orm/query-builder.html#the-query-object** – ndm 2015-02-05 16:06:51

回答

8

只要使用「第一」爲得到的第一個結果:

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

或者,你可以把它像get()工作,這樣它會返回一個異常,如果沒有結果發現:

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

這有效,但它有多高效,因爲你不是限制? (查找所有聽起來像你得到一個大的結果集,然後得到第一個結果集) – Coreus 2015-02-12 15:03:36

+0

使用'RAND()'總是很糟糕,因爲它需要獲得所有結果,隨機排序然後切片結果。關於你的問題,'firstOrFail'會爲你申請一個'LIMIT 1'。但這並不意味着'RAND()'的執行速度會更快。 – 2015-02-12 18:23:45

+0

當然,但是您可以再次觸發查詢緩存,限制影響。 – Coreus 2015-02-13 11:30:45

相關問題