Eloquent Collection: การนับและตรวจจับความว่างเปล่า


272

นี่อาจเป็นคำถามเล็กน้อย แต่ฉันสงสัยว่า Laravel แนะนำวิธีการหนึ่งในการตรวจสอบว่าคอลเล็กชัน Eloquent ที่ส่งคืนมา$result = Model::where(...)->get()นั้นว่างเปล่าหรือไม่รวมถึงการนับจำนวนองค์ประกอบ

ขณะนี้เรากำลังใช้!$resultเพื่อตรวจสอบผลลัพธ์ที่ว่างเปล่านั่นเพียงพอหรือไม่ สำหรับcount($result)จริง ๆ แล้วมันครอบคลุมทุกกรณีรวมถึงผลลัพธ์ที่ว่างเปล่าหรือไม่?

คำตอบ:


581

เมื่อใช้งาน->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) { ... }

หมายเหตุ / การอ้างอิง

ข้อมูลโบนัส

ความแตกต่างระหว่าง Collection และ Query Builder อาจสร้างความสับสนให้กับผู้มาใหม่ของ Laravel เนื่องจากชื่อวิธีมักจะเหมือนกันระหว่างทั้งสอง ด้วยเหตุนี้จึงอาจทำให้สับสนในการรู้ว่าคุณกำลังทำอะไรอยู่ ตัวสร้างแบบสอบถามจะสร้างคิวรีเป็นหลักจนกว่าคุณจะเรียกใช้เมธอดที่จะเรียกใช้คิวรีและกดที่ฐานข้อมูล (เช่นเมื่อคุณเรียกเมธอดบางอย่างเช่น->all() ->first() ->lists()และอื่น ๆ ) วิธีการเหล่านั้นยังมีอยู่บนCollectionวัตถุซึ่งสามารถรับคืนจากตัวสร้างแบบสอบถามหากมีผลลัพธ์หลายรายการ หากคุณไม่แน่ใจว่าคุณใช้คลาสใดอยู่ให้ลองทำvar_dump(User::all())และทดลองเพื่อดูว่าคลาสนั้นกำลังส่งคืนจริง ๆ (ด้วยความช่วยเหลือget_class(...)) ฉันขอแนะนำให้คุณตรวจสอบซอร์สโค้ดสำหรับคลาส Collection มันค่อนข้างง่าย จากนั้นตรวจสอบตัวสร้างแบบสอบถามและดูความคล้ายคลึงกันในชื่อฟังก์ชั่นและดูว่าเมื่อใดที่มันกระทบฐานข้อมูล


4
ขอบคุณเพียงเพื่อเพิ่มว่าถ้าคุณเรียกใช้แบบสอบถามfirst()ผลลัพธ์จะแตกต่างจากget()ซึ่งสามารถตรวจสอบได้ด้วย!$resultผลลัพธ์ที่ว่างเปล่าคือnull
bitinn

2
@binn ใช่ - ถ้าคุณทำModel::first()- มันทำหน้าที่ในวิธีการ 'ตัวแรก' ของตัวสร้างแบบสอบถามและไม่ใช่การรวบรวมดังนั้นมันจะเลือกอันแรกจากฐานข้อมูล - อย่างไรก็ตามModel::get()จะส่งคืนตัวอย่างของ Illuminate \ Support \ การสะสมดังนั้นถ้าคุณทำ$r = Model::get()แล้ว$r->first()มันจะหยิบไอเท็มแรกออกมาจากคอลเลกชันนั้น
Gary Green

สิ่งหนึ่งที่คำตอบนี้ไม่ได้อยู่ก็คือcount($result)ทำงานได้หรือไม่ การเพิ่มรายละเอียดนั้นจะเป็นการปรับปรุง
Mark Amery

ความแตกต่างระหว่าง $ result-> count และ count ($ result) $ result-> count มีผลกระทบกับฐานข้อมูลอีกครั้งหรือไม่ ถ้าไม่ฉันเดาว่ามันเหมือนกัน!
Kamy D

2
@pathros ไม่มีวิธีง่ายๆในการทำเช่นนั้น คุณจะต้องย้ำผ่านสมาชิกของคอลเลกชันแต่ละใช้foreachห่วงและจากนั้นใช้อย่างใดอย่างหนึ่งของการตรวจสอบเหล่านี้ (คิดว่า: count($collection->column))
PapaHotelPapa

71

ฉันคิดว่าคุณกำลังมองหา:

$result->isEmpty()

สิ่งนี้แตกต่างจากempty($result)ซึ่งจะไม่เป็นจริงเพราะผลลัพธ์จะเป็นคอลเลกชันที่ว่างเปล่า คำแนะนำของคุณcount($result)ก็เป็นทางออกที่ดีเช่นกัน ฉันไม่พบการอ้างอิงใด ๆ ในเอกสาร


1
เมื่อคุณต้องการตรวจสอบว่าคอลัมน์ (คุณสมบัติ) เช่นเดียวกับในคอลัมน์ $ collection-> ว่างเปล่า / ว่างหรือไม่?
Pathros

13

ฉันเห็นด้วยกับคำตอบที่ได้รับการอนุมัติข้างต้น แต่ฉันมักจะใช้$results->isNotEmpty()วิธีการตามที่ระบุด้านล่าง

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

มันละเอียดมากกว่าif(!results->isEmpty())เพราะบางครั้งเราลืมเพิ่ม '!' ด้านหน้าซึ่งอาจทำให้เกิดข้อผิดพลาดที่ไม่พึงประสงค์

โปรดทราบว่าวิธีนี้มีให้ตั้งแต่รุ่น5.3ขึ้นไป


4

มีหลายวิธีใน Laravel สำหรับตรวจสอบจำนวนผลลัพธ์ / ตรวจสอบว่าง / ไม่ว่าง:

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

กระบวนการ 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()){}

เพื่อตรวจสอบว่าผลลัพธ์ว่างเปล่าหรือไม่


1

ตาม Laravel เอกสารรัฐที่คุณสามารถใช้วิธีนี้:

$result->isEmpty();

isEmptyวิธีการส่งกลับtrueถ้าคอลเลกชันที่ว่างเปล่า; มิฉะนั้นfalseจะถูกส่งกลับ


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

0

------ แก้ไข ------

ในกรณีนี้คุณต้องการตรวจสอบการนับสองประเภทสำหรับสอง cace

กรณีที่ 1:

หากผลลัพธ์มีเพียงหนึ่งระเบียนคำอื่น ๆ ให้เลือกแถวเดียวจากฐานข้อมูลโดยใช้ -> first ()

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

กรณีที่ 2:

หากผลลัพธ์มีชุดของคำอื่น ๆ อีกหลายแถวที่ใช้ -> get () หรือ -> all ()

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.