ผมอยากจะเรียกไฟล์ที่ผ่านมาแทรกลงในตารางของฉัน ฉันรู้ว่าวิธีการนี้first()
มีอยู่และให้ไฟล์แรกในตารางแก่คุณ แต่ฉันไม่ทราบวิธีรับส่วนแทรกครั้งล่าสุด
ผมอยากจะเรียกไฟล์ที่ผ่านมาแทรกลงในตารางของฉัน ฉันรู้ว่าวิธีการนี้first()
มีอยู่และให้ไฟล์แรกในตารางแก่คุณ แต่ฉันไม่ทราบวิธีรับส่วนแทรกครั้งล่าสุด
คำตอบ:
คุณจะต้องสั่งซื้อตามฟิลด์เดียวกับที่คุณสั่งซื้อตอนนี้ แต่จากมากไปน้อย ตัวอย่างเช่นหากคุณมีการประทับเวลาเมื่อมีการเรียกการอัปโหลดเสร็จupload_time
คุณจะต้องทำสิ่งนี้
สำหรับ Pre-Laravel 4
return DB::table('files')->order_by('upload_time', 'desc')->first();
สำหรับ Laravel 4 เป็นต้นไป
return DB::table('files')->orderBy('upload_time', 'desc')->first();
สำหรับ Laravel 5.7 เป็นต้นไป
return DB::table('files')->latest('upload_time')->first();
การดำเนินการนี้จะเรียงลำดับแถวในตารางไฟล์ตามเวลาที่อัพโหลดเรียงลำดับจากมากไปน้อยและใช้ลำดับแรก นี่จะเป็นไฟล์ที่อัปโหลดล่าสุด
orderBy
เช่นนี้ไม่ใช่order_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();
เรียงลำดับตามวันที่ทำงานได้นานขึ้นเพราะวันที่เป็นสตริงและส่วนใหญ่ไม่ได้จัดทำดัชนี ขณะที่คีย์หลักถูกทำดัชนีและทำงานได้อย่างรวดเร็ว แม้ว่า created_at การจัดทำดัชนีมันเป็นสายอักขระดัชนีและไม่ INT ในกรณีของหลัก สตริงดัชนีมีประสิทธิภาพลดลง
orderBy('created_at', 'desc')
ไม่ได้ให้แถวสุดท้ายแก่คุณ ตัวอย่าง: 3 แถวสามารถมีค่า TIMESTAMP เท่ากันทุกประการและorderBy('created_at', 'desc')
คุณจะได้รับ 1 ใน 3 (ซึ่งไม่จำเป็นต้องเป็นแถวสุดท้าย)
ใช้ขอบเขตล่าสุดที่จัดทำโดย Laravel นอกกรอบ
Model::latest()->first();
ด้วยวิธีนี้คุณจะไม่ได้รับข้อมูลทั้งหมด ทางลัดที่ดีกว่าในการสั่งซื้อโดย
created_at
คอลัมน์($timestamps = true)
ในรุ่น แต่สามารถปิดการใช้งานที่ปรารถนาดังนั้นคุณจะต้องข้อผิดพลาดหากไม่ได้กำหนด
คุณไม่เคยพูดถึงว่าคุณกำลังใช้ Eloquent ORM เริ่มต้นของ Laravel หรือไม่ ในกรณีที่คุณเป็นเช่นสมมติว่าคุณต้องการรับรายการล่าสุดของตารางผู้ใช้โดย created_at คุณอาจทำได้ดังนี้:
User::orderBy('created_at', 'desc')->first();
ก่อนอื่นให้เรียงลำดับผู้ใช้ตามฟิลด์ created_at จากมากไปน้อยจากนั้นจะบันทึกครั้งแรกของผลลัพธ์
ซึ่งจะส่งคืนอินสแตนซ์ของวัตถุผู้ใช้ของคุณไม่ใช่คอลเล็กชัน แน่นอนในการใช้ประโยชน์จากทางเลือกนี้คุณต้องมีโมเดลผู้ใช้ซึ่งขยายคลาส Eloquent สิ่งนี้อาจฟังดูสับสนเล็กน้อย แต่มันง่ายในการเริ่มต้นและ ORM นั้นมีประโยชน์จริง ๆ
สำหรับข้อมูลเพิ่มเติมตรวจสอบเอกสารอย่างเป็นทางการซึ่งค่อนข้างสมบูรณ์และมีรายละเอียดที่ดี
เพื่อรับรายละเอียดบันทึกล่าสุด
Model::all()->last();
หรือModel::orderBy('id', 'desc')->first();
เพื่อรับรหัสบันทึกล่าสุด
Model::all()->last()->id;
หรือ Model::orderBy('id', 'desc')->first()->id;
คอลเลกชัน Laravel มีวิธีการล่าสุด
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
นี่เป็นวิธีที่ดีที่สุดที่จะทำ
all()
วิธีการโหลดรายการทั้งหมดจริง ๆ แล้ว สิ่งนี้จะไม่ทำงานบนโต๊ะที่มีบันทึกนับล้าน
last()
ผลตอบแทนเช่นฝีปากเดียวและไม่ได้เป็นคอลเลกชันและเรียกpluck()
ว่ามีค่าเท่ากับการเรียกModel::all()->pluck('name')
จึงกลับมาname
แอตทริบิวต์ของทุกแถวในตาราง
ลองสิ่งนี้:
Model::latest()->get();
คุณสามารถใช้ขอบเขตล่าสุดที่ Laravel จัดหาให้กับเขตข้อมูลที่คุณต้องการกรองสมมติว่าจะมีการสั่งซื้อโดย ID จากนั้น:
Model::latest('id')->first();
ดังนั้นด้วยวิธีนี้คุณสามารถหลีกเลี่ยงการสั่งซื้อตามcreated_at
สาขาโดยค่าเริ่มต้นที่ Laravel
ในการรับรายละเอียดบันทึกล่าสุดให้ใช้รหัสด้านล่าง:
Model::where('field', 'value')->get()->last()
อีกวิธีที่แฟนซีที่จะทำใน Laravel 6.x (ไม่แน่ใจ แต่ต้องใช้งานได้กับ 5.x เช่นกัน):
DB::table('your_table')->get()->last();
คุณสามารถเข้าถึงฟิลด์ได้เช่นกัน:
DB::table('your_table')->get()->last()->id;
get()
วิธีการจะดึงข้อมูลทุกอย่างจากyour_table
และสร้างคอลเลกชันและlast()
วิธีการจะได้รับไอเท็มสุดท้ายจากคอลเล็กชันนั้น ดังนั้นคุณจะมีข้อมูลทั้งหมดจากตารางที่โหลดในหน่วยความจำของคุณ (ไม่ดี) คุณควรใช้ `DB :: table ('items') -> ล่าสุด () -> first ();` หลังฉากมันทำงานได้ `orderBy ($ column, 'desc') 'และดึงเอาเรคคอร์ดแรก
Model($where)->get()->last()->id
หากคุณกำลังมองหาแถวจริงที่คุณเพิ่งแทรกด้วย Laravel 3 และ 4 เมื่อคุณดำเนินการsave
หรือcreate
ดำเนินการกับโมเดลใหม่เช่น:
$user->save();
-หรือ-
$user = User::create(array('email' => 'example@gmail.com'));
จากนั้นอินสแตนซ์ของโมเดลที่แทรกไว้จะถูกส่งคืนและสามารถใช้สำหรับการดำเนินการต่อไปเช่นการเปลี่ยนเส้นทางไปยังหน้าโปรไฟล์ของผู้ใช้ที่เพิ่งสร้างขึ้น
การค้นหาระเบียนที่แทรกล่าสุดใช้งานได้กับระบบที่มีปริมาณต่ำจะทำงานเกือบตลอดเวลา แต่หากคุณต้องแทรกเข้าไปในเวลาเดียวกันคุณสามารถค้นหาเพื่อค้นหาระเบียนที่ไม่ถูกต้องได้ สิ่งนี้อาจกลายเป็นปัญหาในระบบการทำธุรกรรมที่จำเป็นต้องอัพเดตหลายตาราง
อย่างใดทั้งหมดข้างต้นดูเหมือนจะไม่ทำงานสำหรับฉันใน laravel 5.3 ดังนั้นฉันจึงแก้ไขปัญหาของตัวเองโดยใช้:
Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();
หวังว่าจะสามารถประกันตัวใครบางคนออกไป
ใช้มันจะกลับมาเพียงหนึ่งระเบียนถ้าไม่พบก็จะกลับModel::where('user_id', $user_id)->latest()->get()->first();
null
หวังว่าจะช่วยได้
ถ้าตารางมีเขตข้อมูลวันที่นี่ ( User::orderBy('created_at', 'desc')->first();
) เป็นทางออกที่ดีที่สุดฉันคิดว่า แต่ไม่มีฟิลด์วันที่Model ::orderBy('id', 'desc')->first()->id;
เป็นทางออกที่ดีที่สุดฉันแน่ใจ
ทราบว่าlast()
, latest()
ไม่ได้กำหนดถ้าคุณกำลังมองหาลำดับหรือเหตุการณ์ / สั่งซื้อบันทึก บันทึกล่าสุด / ล่าสุดสามารถมีการcreated_at
ประทับเวลาที่แน่นอนและคุณได้กลับมาไม่ได้กำหนด ทำเช่นorderBy(id|foo)->first()
นั้น ยินดีต้อนรับแนวคิด / คำแนะนำอื่น ๆ เกี่ยวกับวิธีการกำหนดค่า