2013-12-13 6 views
156

यह शायद एक मामूली सवाल है, लेकिन मुझे आश्चर्य है कि क्या लैरवेल यह जांचने के लिए एक निश्चित तरीके की सिफारिश करता है कि $result = Model::where(...)->get() से लौटाया गया एक विलुप्त संग्रह खाली है, साथ ही साथ तत्वों की संख्या को गिनना है।वांछित संग्रह: गिनती और खाली पता लगाएं

हम वर्तमान में खाली परिणाम का पता लगाने के लिए !$result का उपयोग कर रहे हैं, क्या यह पर्याप्त है? count($result) के लिए, क्या यह वास्तव में खाली परिणामों सहित सभी मामलों को कवर करता है?

उत्तर

357

में किसी भी संदर्भ जब ->get() का उपयोग कर आप बस के किसी भी उपयोग नहीं कर सकते नहीं मिल सकता है नीचे:

if (empty($result)) { } 
if (!$result) { } 
if ($result) { } 

क्योंकि अगर आप dd($result); आप Illuminate\Support\Collection का एक उदाहरण पर ध्यान देंगे हमेशा लौटा दिया जाता है, तब भी जब वहाँ कोई परिणाम नहीं हैं अनिवार्य रूप से आप जो जांच रहे हैं वह $a = new stdClass; if ($a) { ... } है जो हमेशा सत्य लौटाएगा।

निर्धारित करने के लिए अगर कोई परिणाम आप भी कर सकते हैं कर रहे हैं निम्नलिखित:

if ($result->first()) { } 
if (!$result->isEmpty()) { } 
if ($result->count()) { } 
if (count($result)) { } 

आप क्वेरी बिल्डर जो पहले पाया मॉडल का एक उदाहरण वापस आ जाएगी पर ->first() बजाय ->get() इस्तेमाल कर सकते हैं, या अन्यथा null अन्यथा। यह उपयोगी है अगर आपको डेटाबेस से केवल एक परिणाम की आवश्यकता है या उम्मीद है।

$result = Model::where(...)->first(); 
if ($result) { ... } 

नोट्स/संदर्भ

बोनस सूचना

संग्रह और क्वेरी बिल्डर मतभेद Laravel के नए चेहरे क्योंकि करने के लिए थोड़ा भ्रमित कर सकते हैं विधि के नाम अक्सर दोनों के बीच समान होते हैं। इसी कारण से यह जानना भ्रमित हो सकता है कि आप किस पर काम कर रहे हैं। क्वेरी बिल्डर अनिवार्य रूप से एक क्वेरी बनाता है जब तक आप एक विधि को कॉल नहीं करते हैं, जहां यह क्वेरी निष्पादित करेगा और डेटाबेस को हिट करेगा (उदाहरण के लिए जब आप ->all()->first()->lists() और अन्य कुछ निश्चित विधियों को कॉल करते हैं)। उन विधियों Collection ऑब्जेक्ट पर मौजूद हैं, जो कई परिणाम होने पर क्वेरी बिल्डर से वापस आ सकते हैं।यदि आप सुनिश्चित नहीं हैं कि आप वास्तव में किस वर्ग के साथ काम कर रहे हैं, तो var_dump(User::all()) करने का प्रयास करें और यह देखने के लिए प्रयोग करें कि वास्तव में कौन सी कक्षाएं लौट रही हैं (get_class(...) की सहायता से)। मैं अत्यधिक अनुशंसा करता हूं कि आप संग्रह वर्ग के लिए स्रोत कोड देखें, यह बहुत आसान है। फिर क्वेरी बिल्डर को देखें और फ़ंक्शन नामों में समानताएं देखें और यह पता लगाएं कि यह वास्तव में डेटाबेस को हिट करता है।

+4

thx, बस यह जोड़ने के लिए कि यदि आप 'पहले() 'क्वेरी चलाते हैं, तो परिणाम' get() 'से अलग होता है, जिसे'! $ परिणाम' के साथ चेक किया जा सकता है क्योंकि खाली परिणाम 'शून्य' – bitinn

+2

@btinn yes - - यदि आपने यानी 'मॉडल :: पहले() 'किया है - यह वास्तव में क्वेरी बिल्डर की' पहली 'विधि पर काम कर रहा है और संग्रह नहीं है, इसलिए यह डेटाबेस से पहला विकल्प लेगा - हालांकि' मॉडल :: प्राप्त करें() 'इल्यूमिनेट \ Support \ संग्रह का एक उदाहरण वापस कर देगा, इसलिए यदि आपने' $ r = मॉडल :: get() 'और फिर' $ r-> पहले() 'किया है तो यह उस संग्रह के भीतर पहला आइटम निकाल देगा । –

+0

एक बात यह है कि यह जवाब पता नहीं है कि क्या 'गिनती ($ परिणाम) 'काम करता है; यह विस्तार जोड़ना एक सुधार होगा। –

43

मुझे लगता है कि आप देख रहे हैं:

$result->isEmpty() 

यह empty($result) से अलग है, क्योंकि परिणाम एक खाली संग्रह हो जाएगा जो सच नहीं होगा। count($result) का आपका सुझाव भी एक अच्छा समाधान है। मैं डॉक्स

+0

लिंक टूटा हुआ है। –

+0

जब आप केवल एक ही जांचना चाहते हैं कि एक विशिष्ट कॉलम (संपत्ति) $ संग्रह-> कॉलम खाली/शून्य है या नहीं? – Pathros

0

तो Laravel वास्तव में एक संग्रह लौटाता है जब सिर्फ Model::all(); का उपयोग कर आप एक संग्रह आप एक सरणी आप इसे सेट टाइप कर सकते हैं तो चाहते हैं नहीं करना चाहती। (array)Model::all(); तो आप array_filter का उपयोग परिणाम

$models = (array)Model::all() 
$models = array_filter($models); 
if(empty($models)) 
{ 
do something 
} 

यह भी आप count() जैसे कार्य करने के लिए अनुमति देगा वापस जाने के लिए कर सकते हैं।

+3

इसे एक संग्रह के रूप में रखना वास्तव में सुविधाजनक है ताकि लौटाई गई वस्तुएं संग्रह संग्रह में बहुत उपयोगी कार्य प्राप्त कर सकें। – Gokigooooks

4

मैं उपरोक्त अनुमोदित उत्तर से सहमत हूं। लेकिन आमतौर पर मैं नीचे दिए गए अनुसार $results->isNotEmpty() विधि का उपयोग करता हूं।

if($results->isNotEmpty()) 
{ 
//do something 
} 

यह क्योंकि कभी कभी हम जोड़ने के लिए भूल जाते हैं if(!results->isEmpty()) की तुलना में अधिक वर्बोज़ है '!' जिसके सामने अवांछित त्रुटि हो सकती है।

ध्यान दें कि यह विधि संस्करण 5.3 से आगे है।

1

वहाँ कई परिणामों की जाँच के लिए Laravel में दिए गए तरीकों गिनती/चेक खाली/खाली नहीं हैं:

$result->isNotEmpty(); // True if result is not empty. 
$result->isEmpty(); // True if result is empty. 
$result->count(); // Return count of records in result. 
0

------ हल ------

इस में

मामले आपके पास दो CACE

मामले 1 के लिए गिनती के दो प्रकार की जांच करना चाहते हैं:

मैं च परिणाम केवल एक रिकॉर्ड अन्य शब्द का उपयोग कर डेटाबेस से ही पंक्ति का चयन होते हैं -> पहले()

if(count($result)){ 

     ...record is exist true... 
    } 

मामले 2:

यदि परिणाम का उपयोग कर कई पंक्ति अन्य शब्द का समूह होता है -> (मिल) या -> सभी()

if($result->count()) { 

     ...record is exist true... 
    } 
संबंधित मुद्दे