एलोकेंट कलेक्शन: काउंटिंग एंड डिटेक्ट खाली


272

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

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

जवाबों:


580

उपयोग करते समय ->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) { ... }

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

बोनस की जानकारी

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


4
thx, सिर्फ यह जोड़ने के लिए कि यदि आप क्वेरी चलाते हैं first(), तो परिणाम इससे अलग है get(), जिसे !$resultखाली परिणाम के साथ चेक किया जा सकता हैnull
बिटिन

2
@btinn हाँ - यदि आपने किया है Model::first()- यह वास्तव में क्वेरी बिल्डर के 'पहले' तरीके पर काम कर रहा है और संग्रह नहीं है, इसलिए यह डेटाबेस से पहले एक को चुन लेगा - हालांकि Model::get()इलुमिनाटे \ समर्थन का एक उदाहरण लौटाएगा \ Collection तो अगर आपने किया है $r = Model::get()और फिर $r->first()यह उस संग्रह के भीतर पहला आइटम बाहर ले जाएगा।
गैरी ग्रीन

एक बात यह है कि इसका जवाब यह नहीं है कि क्या count($result)काम करता है; उस विवरण को जोड़ना एक सुधार होगा।
मार्क अमेरी सिप

$ परिणाम-> गणना और गणना ($ परिणाम) के बीच क्या अंतर है? यदि नहीं, तो मुझे लगता है कि ये वही हैं!
कामि डी

2
@pathros ऐसा करने का कोई सरल तरीका नहीं है। आपको foreachलूप का उपयोग करके संग्रह के प्रत्येक सदस्य के माध्यम से पुनरावृति करना होगा और फिर इनमें से किसी एक चेक (विचार:) का उपयोग करना होगा count($collection->column)
पापाहोटलपापा

70

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

$result->isEmpty()

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


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

13

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

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

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

ध्यान दें कि यह विधि 5.3 संस्करण के बाद से मौजूद है ।


4

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

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

4

मैं इस्तेमाल करना बेहतर समझता हूं

$result->isEmpty();

यदि संग्रह खाली है तो TheEmpty विधि सही है; अन्यथा, झूठी लौटा दी जाती है।


3

मुझे लगता है कि आप कुछ ऐसा करने की कोशिश करते हैं

  @if(!$result->isEmpty())
         // $result is not empty
    @else
        // $result is empty
    @endif

या भी उपयोग करें

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

2

तुम कर सकते हो

$result = Model::where(...)->count(); 

परिणाम गिनने के लिए।

आप भी उपयोग कर सकते हैं

if ($result->isEmpty()){}

रिजल्ट खाली है या नहीं, यह जांचने के लिए।



0

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

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

यह भी आप की तरह बातें करने के लिए अनुमति देगा count()


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

0

------हल किया------

इस मामले में आप दो cace के लिए दो प्रकार की गणना की जाँच करना चाहते हैं

मामला एक:

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

 if(count($result)){
     
       ...record is exist true...
  }

मामला 2:

यदि परिणाम में एकाधिक पंक्ति का उपयोग कर दूसरे शब्द का सेट होता है -> प्राप्त () या -> सभी ()

  if($result->count()) {
    
         ...record is exist true...
  }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.