Eloquent: find() และwhere() การใช้งาน laravel

ฉันกำลังพยายามรับบันทึกจากตารางฐานข้อมูล posts โดยใช้รหัสของมัน ฉันปวดหัวกับเมธอด find() มาระยะหนึ่งแล้ว โดยสับสนว่าทำไมมันถึงใช้งานไม่ได้ นี่คือข้อความค้นหาของฉันที่ดูถูกต้องสำหรับฉันแต่ไม่ได้ผล:

$post = Post::find($id);
$post->delete();

ฉันทำสิ่งนี้อย่างไม่เต็มใจ:

$post = Post::where('id', $id);
$post->delete();

และน่าประหลาดใจมากที่มันได้ผล แต่ฉันไม่รู้ว่าทำอย่างไร

ฉันรู้ด้วยว่า where() แตกต่างจาก find() ตรงที่เป็นตัวสร้างคิวรี ดังนั้นฉันจึงสามารถใช้มันในลักษณะนี้: Post::where('id', $id)->first()

มีความคิดเห็นเกี่ยวกับความแตกต่างในวิธีการทำงานอย่างไร


person Awa Melvine    schedule 21.11.2016    source แหล่งที่มา


คำตอบ (3)


รหัสของคุณดูดี แต่มีบางสิ่งที่ต้องระวัง:

Post::find($id); ดำเนินการกับคีย์หลัก หากคุณได้ตั้งค่าคีย์หลักในโมเดลของคุณเป็นอย่างอื่นที่ไม่ใช่ id โดยทำดังนี้:

protected  $primaryKey = 'slug';

จากนั้น find จะค้นหาด้วยคีย์นั้นแทน

Laravel ยังคาดหวังว่า id จะเป็นจำนวนเต็ม หากคุณใช้อย่างอื่นที่ไม่ใช่จำนวนเต็ม (เช่น สตริง) คุณต้องตั้งค่าคุณสมบัติการเพิ่มในโมเดลของคุณให้เป็นเท็จ:

public $incrementing = false;
person craig_h    schedule 22.11.2016
comment
มีความแตกต่างที่สำคัญในการดำเนินการตามกระบวนการลบ หากคุณใช้อินสแตนซ์โมเดลเพื่อลบ เช่น $post->delete() จะมีการเรียกใช้แบบสอบถามสองรายการ หนึ่งเพื่อดึงบันทึกจากฐานข้อมูลโดยใช้เมธอด find() และอันที่สองเพื่อลบบันทึก เมื่อใช้ตัวสร้างคิวรี จะมีการดำเนินการเพียง 1 คิวรีเท่านั้น โดยจะไม่มีการสร้างอินสแตนซ์โมเดล ด้วยเหตุนี้ ฟีเจอร์ใดๆ ในโมเดล Post จะไม่ทำงาน ตัวอย่างเช่น หากคุณมีตัวฟังเหตุการณ์การลบโมเดล ก็จะไม่ถูกดำเนินการ - person Ahmed Shefeer; 24.07.2018
comment
ควรเน้นผู้ตอบคำถามของ Ahmed เนื่องจากความแตกต่างอาจทำให้เกิดความสับสนได้มาก - person Mathieu Bour; 15.05.2019

หากต้องการเพิ่มความคิดเห็นของ craig_h ด้านบน (ขณะนี้ฉันมีตัวแทนไม่เพียงพอที่จะเพิ่มสิ่งนี้เป็นความคิดเห็นสำหรับคำตอบของเขา ขออภัย) หากคีย์หลักของคุณไม่ใช่จำนวนเต็ม คุณจะต้องบอกโมเดลของคุณด้วยว่าข้อมูลประเภทใด คือโดยการตั้งค่า keyType ที่ด้านบนของคำจำกัดความโมเดล

public $keyType = 'string'

Eloquent เข้าใจประเภทใดๆ ก็ตามที่กำหนดไว้ในฟังก์ชัน castAttribute() ซึ่งใน Laravel 5.4 ได้แก่: int, float, string, bool, object, array, collection, date and timestamp

เพื่อให้แน่ใจว่าคีย์หลักของคุณจะถูกแปลงเป็นประเภทข้อมูล PHP ที่เทียบเท่ากันอย่างถูกต้อง

person SlyDave    schedule 20.07.2017

ไม่พบข้อยกเว้น

บางครั้งคุณอาจต้องการส่งข้อยกเว้นหากไม่พบโมเดล สิ่งนี้มีประโยชน์อย่างยิ่งในเส้นทางหรือตัวควบคุม เมธอด findOrFail และ firstOrFail จะดึงผลลัพธ์แรกของแบบสอบถาม อย่างไรก็ตาม หากไม่พบผลลัพธ์ Illuminate\Database\Eloquent\ModelNotFoundException จะถูกโยนทิ้ง:

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();

หากตรวจไม่พบข้อยกเว้น การตอบสนอง 404 HTTP จะถูกส่งกลับไปยังผู้ใช้โดยอัตโนมัติ ไม่จำเป็นต้องเขียนเช็คที่ชัดเจนเพื่อส่งคืนการตอบกลับ 404 เมื่อใช้วิธีการเหล่านี้:

Route::get('/api/flights/{id}', function ($id) {
    return App\Flight::findOrFail($id);
});
person Miqayel    schedule 08.12.2019