2015-02-05 4 views
6

मैं केकपीएचपी 3.0 आरसी -1 के साथ एक यादृच्छिक पंक्ति पुनर्प्राप्त करने की कोशिश कर रहा हूं, मैंने the docs में देखा है।मुझे केकपीएचपी 3.0 में यादृच्छिक पंक्ति कैसे मिल सकती है?

केकपीएचपी 2.X से जो मैंने किया था उसका उपयोग करना और केकपीएचपी 3.0 आरसी -1 में यादृच्छिक पंक्ति प्राप्त करने के लिए इसे प्रारंभिक बिंदु के रूप में डालना। हालांकि, यह स्पष्ट रूप से मिस केक के लिए ऐसा नहीं कर रहा है:

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

परिणाम कुछ भी नहीं पैदा करता है। डेटाबेस में डेटा है, और मैं एकल रिकॉर्ड पुनर्प्राप्त करने में सक्षम हूं। (आईई $ यह-> गेम-> प्राप्त करें (20) इस तरह काम करता है)।

+0

मेरे लिए ठीक काम करता है ... आप परिणाम के लिए वास्तव में परीक्षण कैसे कर रहे हैं (केवल '$ परिणाम' डीबग करने से क्वेरी निष्पादित नहीं होगी)? पीएस, हाल ही में देव स्नैपशॉट के साथ भी प्रयास करें। – ndm

+0

उस मामले के लिए व्यू या नियंत्रक में पूरी $ गेम इकाई को var_dump करें। यह सबसे हाल ही में देव स्नैपशॉट है। – Coreus

+1

वहां आपके पास है, आप जो कर रहे हैं वह एक प्रश्न डंप कर रहा है, न कि परिणाम। आपको वास्तव में पहले कुछ प्राप्त करना होगा, उदाहरण के लिए 'पहले() 'का उपयोग करके (आप' सीमा() 'को हटा सकते हैं)। ** 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

'रैंड()' का उपयोग करना हमेशा भयानक होता है, क्योंकि इसे सभी परिणाम प्राप्त करने की आवश्यकता होती है, उन्हें यादृच्छिक रूप से आदेश दें और फिर परिणामों को टुकड़ा करें। आपके प्रश्न के बारे में, 'firstOrFail' आपके लिए' LIMIT 1' लागू करेगा। इसका मतलब यह नहीं है कि 'रैंड() 'तेजी से प्रदर्शन करेगा। –

+0

निश्चित रूप से, लेकिन फिर आप फिर से-कैन-ट्रिगर क्वेरी कैशिंग को ट्रिगर करते हैं, जिससे प्रभाव सीमित हो जाता है। – Coreus

संबंधित मुद्दे