সুস্পষ্ট সংগ্রহ: খালি গণনা এবং সনাক্তকরণ


272

এটি একটি তুচ্ছ প্রশ্ন হতে পারে তবে আমি ভাবছি যে লারাভেল কোনও নির্দিষ্ট উপায় সংগ্রহ করে $result = Model::where(...)->get()খালি কিনা তা পরীক্ষা করার জন্য কোনও নির্দিষ্ট উপায়ের পাশাপাশি উপাদানগুলির সংখ্যা গণনা করার পরামর্শ দিচ্ছেন কিনা wond

আমরা বর্তমানে !$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
@ বিটিন হ্যাঁ - যদি আপনি Model::first()এটি করেন - তবে এটি আসলে ক্যোয়ারী নির্মাতার 'প্রথম' পদ্ধতিতে কাজ করছে এবং সংগ্রহ নয়, সুতরাং এটি ডাটাবেস থেকে প্রথমটি বেছে নেবে - তবে Model::get()আলোকিত \ সমর্থনের একটি উদাহরণ ফিরে আসবে \ সংগ্রহ তাই আপনি যদি করেন $r = Model::get()এবং তারপর $r->first()এটি সংগ্রহের মধ্যে প্রথম আইটেমটি বেছে নেবে।
গ্যারি গ্রিন

এই উত্তরটির একটি বিষয় সম্বোধন করে না যা count($result)কাজ করে কিনা ; যে বিবরণ যোগ করা একটি উন্নতি হবে।
মার্ক আমেরিকা

$ ফলাফল-> গণনা এবং গণনার মধ্যে পার্থক্য কী (difference ফলাফল) $ ফলাফল-> গণনা আবার ডাটাবেসে আঘাত করে? যদি তা না হয় তবে আমার ধারণা এইগুলি কি তবে একই রকম!
কাম্য ডি

2
@ পাথ্রোস এটি করার সহজ কোনও উপায় নেই। আপনাকে সংগ্রহের প্রতিটি সদস্যের মধ্য দিয়ে একটি foreachলুপ ব্যবহার করে পুনরাবৃত্তি করতে হবে এবং তারপরে এই চেকগুলির একটি ব্যবহার করুন (মনে করুন count($collection->column):)।
পাপাহোটেলপাপা

70

আমি মনে করি আপনি খুঁজছেন:

$result->isEmpty()

এটি এর থেকে পৃথক empty($result), যা সত্য হবে না কারণ ফলাফলটি খালি সংগ্রহ হবে। আপনার পরামর্শটিও count($result)একটি ভাল সমাধান। আমি ডক্সে কোনও রেফারেন্স পাই না


1
আপনি যখন কেবলমাত্র একটি নির্দিষ্ট কলাম (সম্পত্তি) যেমন property সংগ্রহ-> কলামে পছন্দ করেন তা খালি / নাল কিনা তা পরীক্ষা করতে চান কীভাবে?
প্যাথ্রোস

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();

সংগ্রহটি ফাঁকা থাকলে এইম্পটি পদ্ধতিটি সত্য করে; অন্যথায়, মিথ্যা ফিরিয়ে দেওয়া হয়।


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();তারপরে ফলাফলগুলি ফিরিয়ে দিতে আপনি অ্যারে_ ফিল্টার ব্যবহার করতে পারেন

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

এই আপনার মত কিছু করার অনুমতি দেবে count()


3
সংগ্রহ হিসাবে এটি রাখা আসলেই সুবিধাজনক যাতে ফেরত দেওয়া বস্তুগুলি সংগ্রহের সম্মুখভাগে প্রচুর দরকারী ফাংশন পেতে পারে।
গকিগুকস

0

------ মীমাংসিত ------

এই ক্ষেত্রে আপনি দুটি কেসের জন্য দুই ধরণের গণনা পরীক্ষা করতে চান

মামলা 1:

ফলাফলের মধ্যে যদি কেবল একটি রেকর্ড থাকে তবে অন্য শব্দটি ডাটাবেস থেকে একক সারি নির্বাচন করুন -> প্রথম () ব্যবহার করে

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

কেস 2:

ফলাফলটিতে -> get () বা -> সমস্ত () ব্যবহার করে একাধিক সারির অন্য শব্দের সেট থাকে

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.