อะไรคือความแตกต่างระหว่าง find (), findOrFail (), first (), firstOrFail (), get (), list (), toArray ()


115

อะไรคือความแตกต่างระหว่างวิธีการเหล่านี้:

  1. find()
  2. findOrFail()
  3. first()
  4. firstOrFail()
  5. get()
  6. list()
  7. toArray()

ฉันใช้มันมาแล้วแต่ละอันให้ผลลัพธ์ที่แตกต่างกันและบางครั้งฉันก็ต้องเพิ่มtoArray()ในตอนท้ายget()เพราะฟังก์ชันของฉันคาดหวังว่าจะมีอาร์เรย์ วิธีอื่นจะไม่สร้างอาร์เรย์ด้วยหรือไม่?


1
มีดูที่เอกสารสร้างแบบสอบถาม , เช่นเดียวกับการอ้างอิงฝีปาก API
Stuart Wagner

ข้อมูลทั้งหมดจาก @Joseph Silber ถูกต้องและมีประโยชน์มาก ฉันต้องการเพิ่มคำตอบในรายการ () จาก Laravel 5.2 วิธีการแสดงรายการบนคอลเลกชันตัวสร้างคิวรีและอ็อบเจ็กต์ตัวสร้างคิวรี Eloquent ถูกเปลี่ยนชื่อเป็นถอน ลายเซ็นของวิธีการยังคงเหมือนเดิม
Nirav Bhoi

คำตอบ:


242
  1. find($id)รับ id และส่งคืนโมเดลเดียว nullถ้าไม่มีรูปแบบการจับคู่ที่มีอยู่ก็จะส่งกลับ

  2. findOrFail($id)รับ id และส่งคืนโมเดลเดียว ถ้าไม่มีมีอยู่รูปแบบการจับคู่มันจะพ่นข้อผิดพลาด1

  3. first()ส่งคืนระเบียนแรกที่พบในฐานข้อมูล nullถ้าไม่มีรูปแบบการจับคู่ที่มีอยู่ก็จะส่งกลับ

  4. firstOrFail()ส่งคืนระเบียนแรกที่พบในฐานข้อมูล ถ้าไม่มีมีอยู่รูปแบบการจับคู่มันจะพ่นข้อผิดพลาด1

  5. get() ส่งคืนชุดโมเดลที่ตรงกับแบบสอบถาม

  6. pluck($column)ส่งคืนคอลเลกชันของเฉพาะค่าในคอลัมน์ที่กำหนด ในรุ่นก่อนหน้าของ Laravel listsวิธีการนี้ถูกเรียกว่า

  7. toArray() แปลงโมเดล / คอลเลกชันเป็นอาร์เรย์ PHP อย่างง่าย


หมายเหตุ: คอลเลกชันเป็นอาร์เรย์ที่เพิ่มขึ้น มันทำหน้าที่คล้าย ๆ กับอาร์เรย์ แต่มีจำนวนมากเพิ่มฟังก์ชันการทำงานในขณะที่คุณสามารถเห็นในเอกสาร

น่าเสียดายที่ PHP ไม่อนุญาตให้คุณใช้วัตถุคอลเลกชันทุกที่ที่คุณสามารถใช้อาร์เรย์ได้ ตัวอย่างเช่นการใช้คอลเลกชันในforeachลูปก็ใช้ได้ แต่การส่งผ่านไปยังarray_mapไม่ใช่ ในทำนองเดียวกันหากคุณพิมพ์คำใบ้อาร์กิวเมนต์เป็นarrayPHP จะไม่อนุญาตให้คุณส่งผ่านคอลเล็กชัน เริ่มต้นใน PHP 7.1 มีiterabletypehintซึ่งสามารถใช้เพื่อยอมรับทั้งอาร์เรย์และคอลเลคชัน

หากคุณต้องการรับอาร์เรย์ธรรมดาจากคอลเล็กชันให้เรียกall()ใช้ method


1ข้อผิดพลาดที่เกิดจากfindOrFailand firstOrFailmethod คือ a ModelNotFoundException. หากคุณไม่พบข้อยกเว้นนี้ด้วยตัวเองLaravel จะตอบสนองด้วย 404ซึ่งเป็นสิ่งที่คุณต้องการเกือบตลอดเวลา


1
ขอบคุณสำหรับการล้างข้อมูล นี่คือสิ่งที่ฉันพยายามรับรายการโพสต์เช่นนี้$post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);เพื่อให้ฉันสามารถเข้าถึงได้$post->subreddit->moderators->user_idแต่นั่นเป็นการให้Undefined property: Illuminate\Database\Eloquent\Collection::$user_id- ฉันสามารถเข้าถึง$post->subreddit->moderatorsได้ แต่ไม่สามารถเข้าถึงได้เมื่อฉันเพิ่มuser_id- ทำไมถึงเป็นเช่นนั้น?
Halnex

subredditเป็นแบบจำลองเดียวที่มีmoderatorsคุณสมบัติ moderatorsเป็นคอลเล็กชันไม่ใช่แบบจำลองเดียว คุณไม่สามารถเข้าถึงอะไรได้โดยตรงจากมัน คุณสามารถตรวจสอบอันแรกได้หากต้องการ:$post->subreddit->moderators[0]->user_id
Joseph Silber

ฉันคิดว่าคุณควรแทนที่ "มันพ่นข้อผิดพลาด" ด้วย "มันโยนข้อยกเว้น ModelNotFoundException": D ยังไงก็มีส่วนช่วยอย่างมาก;)
bobbybouwmann

@JosephSilber เป๊ะ!
bobbybouwmann

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