तालिका में अंतिम पंक्ति का चयन करें


163

मैं अपनी तालिका में सम्मिलित अंतिम फ़ाइल को पुनः प्राप्त करना चाहूंगा। मुझे पता है कि विधि first()मौजूद है और आपको तालिका में पहली फ़ाइल प्रदान करती है, लेकिन मुझे नहीं पता कि अंतिम प्रविष्टि कैसे प्राप्त करें।


इसके अलावा stackoverflow.com/questions/33321447/… किसी मौजूदा रिश्ते (हैमनी) को कैसे सॉर्ट करें
तारेक एडम

यह लारवेल के बारे में पूछने और जवाब देने वाले किसी के लिए है। याद रखें कि यह निर्दिष्ट करना महत्वपूर्ण है कि आप किस Laravel संस्करण की बात कर रहे हैं। आम तौर पर संस्करण 4 और 5 में अंतर और पुराने संस्करण भी होते हैं।
हेरोसेलोहिम

जवाबों:


224

आपको उसी क्षेत्र द्वारा ऑर्डर करने की आवश्यकता होगी जिसे आप अब तक ऑर्डर कर रहे हैं, लेकिन अवरोही। एक उदाहरण के रूप में, यदि आपके पास अपलोड किए जाने के समय एक टाइम स्टैम्प है upload_time, तो आप ऐसा कुछ करेंगे;

प्री-लारवेल 4 के लिए

return DB::table('files')->order_by('upload_time', 'desc')->first();

लारवेल 4 और उसके बाद के लिए

return DB::table('files')->orderBy('upload_time', 'desc')->first();

लारवेल 5.7 और उसके बाद के लिए

return DB::table('files')->latest('upload_time')->first();

यह फ़ाइल तालिका में पंक्तियों को समय, अवरोही क्रम , और पहले वाले को अपलोड करके आदेश देगा । यह नवीनतम अपलोड की गई फ़ाइल होगी।


15
orderByorder_by
लारवेल

9
जब आप ORM का उपयोग करते हैं, तो यह एक सही तरीका है:User::orderby('created_at', 'desc')->first();
Cas Bloem

1
orderBy('created_at', 'desc')
लारवेल

9
आप create_at कॉलम का उपयोग क्यों कर रहे हैं? प्राथमिक कुंजी आईडी का उपयोग करने के लिए बहुत तेज़ है। Laravel 5.x Files::orderBy(id', 'desc')->first();ऑर्डर दिनांक से अधिक समय तक काम करता है क्योंकि दिनांक स्ट्रिंग है और सबसे अधिक संभावना नहीं अनुक्रमित है। जबकि प्राथमिक कुंजी अनुक्रमित है और सुपर फास्ट काम करती है। भले ही create_at अनुक्रमित हो, यह प्राथमिक के मामले में अनुक्रमित स्ट्रिंग और INT नहीं है। इंडेक्स स्ट्रिंग का प्रदर्शन कम है।
कोराबेनलैड्स

4
@KorbenDallas टिप्पणी का उत्तर होना चाहिए क्योंकि कभी-कभी orderBy('created_at', 'desc')आपको अंतिम पंक्ति नहीं मिलती है । उदाहरण: 3 पंक्तियों में ठीक उसी प्रकार का TIMESTAMP मान हो सकता है और आपके साथ orderBy('created_at', 'desc')3 में से पहला मिलेगा (जो जरूरी नहीं कि अंतिम पंक्ति हो)
viery365

111

लारवेल द्वारा प्रदान किए गए नवीनतम दायरे का उपयोग करें।

Model::latest()->first();

इस तरह आप सभी अभिलेखों को पुनः प्राप्त नहीं कर रहे हैं। ऑर्डर करने के लिए एक अच्छा शॉर्टकट।


7
ध्यान दें कि यह विधि मॉडल में ऑटो-जनरेट किए गए created_atकॉलम का उपयोग करती है ($timestamps = true), लेकिन इसे इच्छा पर अक्षम किया जा सकता है, इसलिए यदि आप अनिर्दिष्ट हैं तो एक त्रुटि होगी
Plotisateur

मैं Laravel 5.7 का उपयोग कर रहा हूं और एक मॉडल पर ऐसा करने की कोशिश कर रहा हूं फिर भी मेरे लिए सभी रिकॉर्ड पुनर्प्राप्त करता है।
सीजे डेनिस

1
ध्यान दें कि यदि आपके पास एक ही सेकंड के भीतर कई रिकॉर्ड जोड़े गए हैं, तो इन रिकॉर्ड्स के लिए create_at समय समान होगा और इसलिए नवीनतम द्वारा लौटाया गया रिकॉर्ड () वह रिकॉर्ड नहीं हो सकता है जिसकी आप अपेक्षा करते हैं।
F3CP

ध्यान दें कि आपको 'create_at' कॉलम की आवश्यकता नहीं है। आप यह निर्दिष्ट कर सकते हैं कि आपको किस कॉलम में नवीनतम चाहिए। उदाहरण के लिए: मॉडल :: नवीनतम ('dateColumn') -> पहला ();
टॉम

यह वास्तविक अंतिम पंक्ति प्राप्त करने में विफल हो सकता है यदि दो पंक्ति को 1 सेकंड के भीतर डाला जाता है (वास्तव में इकाई परीक्षण में समस्याएं पैदा होती हैं)।
चिली

75

आपने कभी उल्लेख नहीं किया है कि आप एलक्वेंट, लारवेल के डिफ़ॉल्ट ओआरएम का उपयोग कर रहे हैं या नहीं। यदि आप हैं, तो मान लें कि आप उपयोगकर्ता तालिका की नवीनतम प्रविष्टि बनाना चाहते हैं, create_at द्वारा, आप संभवतः इस प्रकार कर सकते हैं:

User::orderBy('created_at', 'desc')->first();

सबसे पहले, यह उपयोगकर्ताओं को क्रम से बनाया गया है, और फिर यह परिणाम का पहला रिकॉर्ड लेता है।

यह आपको एक संग्रह नहीं, उपयोगकर्ता ऑब्जेक्ट का एक उदाहरण लौटाएगा। बेशक, इस विकल्प का उपयोग करने के लिए, आपके पास एक उपयोगकर्ता मॉडल होना चाहिए, जो एलक्वेंट क्लास का विस्तार कर रहा है। यह थोड़ा भ्रामक लग सकता है, लेकिन इसे शुरू करना वास्तव में आसान है और ओआरएम वास्तव में मददगार हो सकता है।

अधिक जानकारी के लिए, आधिकारिक दस्तावेज देखें जो बहुत समृद्ध और विस्तृत है।


42

पिछले रिकॉर्ड विवरण प्राप्त करने के लिए

  1. Model::all()->last(); या
  2. Model::orderBy('id', 'desc')->first();

पिछले रिकॉर्ड आईडी प्राप्त करने के लिए

  1. Model::all()->last()->id; या
  2. Model::orderBy('id', 'desc')->first()->id;

14

लारवेल संग्रह में अंतिम विधि है

Model::all() -> last(); // last element 
Model::all() -> last() -> pluck('name'); // extract value from name field. 

यह इसे करने का सबसे अच्छा तरीका है।


16
बस यह इंगित करना चाहता था कि all()विधि वास्तव में सभी वस्तुओं को लोड करती है। यह लाखों रिकॉर्ड वाले टेबल पर काम नहीं करेगा।
स्टीवन जेफ्रीस

1
स्टीवन जेफ्रीस टिप्पणी के अलावा, मैं यह बताना चाहता हूं कि कॉलिंग last()एक एकल उदाहरण को लौटाती है और संग्रह नहीं है, और pluck()उस पर कॉल करना कॉल करने के बराबर है Model::all()->pluck('name'), इसलिए तालिका nameकी सभी पंक्तियों की विशेषता को वापस करना
ivcandela

5
यह विधि वास्तव में बदतर है। आप PHP को निष्पादन के बजाय अंतिम कच्चे का उपयोग कर रहे हैं बजाय इसे DB स्तर के रूप में करने के। क्या होगा यदि तालिका में लाखों कच्चे हैं, तो आप जानते हैं कि यह कितना अक्षम हो सकता है?
भास्कर दबी

यह इसे करने का सबसे अच्छा तरीका है। - नहीं! कभी नहीं रहा, कभी नहीं होगा। आपको अपनी ज़रूरत के बजाय सभी पंक्तियों को लोड करना होगा ।
रेने रोथ

11

इसे इस्तेमाल करे :

Model::latest()->get();

1
यह कई पंक्तियों को लौटाएगा। उसे एक ही पंक्ति की जरूरत है। पहले () उसे ऑर्डरबी () क्लॉज के साथ मदद करेगा।
ताहिर अफरीदी

यह वास्तविक अंतिम पंक्ति प्राप्त करने में विफल हो सकता है यदि दो पंक्ति को 1 सेकंड के भीतर डाला जाता है (वास्तव में इकाई परीक्षण में समस्याएं पैदा होती हैं)।
चिली

1
एक बड़ी तालिका में यह मेमोरी अपवाद से बाहर निकलेगा क्योंकि @TahirAfridi ने उल्लेख किया है कि यह सभी पंक्तियों को मेमोरी में लोड कर देगा।
रिहर्सल

6

आप जिस क्षेत्र को फ़िल्टर करना चाहते हैं, उसके साथ लारवेल द्वारा प्रदान की गई नवीनतम गुंजाइश का उपयोग कर सकते हैं, मान लें कि यह आईडी द्वारा आदेश दिया जाएगा, फिर:

Model::latest('id')->first();

तो इस तरह से, आप created_atलारवेल में डिफ़ॉल्ट रूप से फ़ील्ड के अनुसार ऑर्डर करने से बच सकते हैं ।


5

अंतिम रिकॉर्ड विवरण प्राप्त करने के लिए, नीचे दिए गए कोड का उपयोग करें:

Model::where('field', 'value')->get()->last()

इसका उपयोग न करें। यह एक बहुत बुरा अभ्यास है एक गुंजाइश है नवीनतम () यह अंतिम सम्मिलित पंक्ति तक सीधे पहुंच प्रदान करता है।
वर्किंग सुअर

3

एक और फैंसी तरीका है इसे Laravel 6.x (Unsure लेकिन 5.x aswell के लिए काम करना चाहिए) में:

DB::table('your_table')->get()->last();

आप खेतों तक भी पहुँच सकते हैं:

DB::table('your_table')->get()->last()->id;


इसके अलावा मेरे लिए लारवेल 5.8 में काम करता है, बस तुम्हारा देखने से पहले जवाब पोस्ट कर दिया
Dazzle

1
इस बात पर थोड़ा स्पष्टीकरण कि लार्वा इस दृश्य के पीछे कैसे होता है और यह बड़े डेटा सेट के लिए खतरनाक क्यों है, get()विधि सब कुछ प्राप्त करेगी your_tableऔर एक संग्रह उत्पन्न last()करेगी और विधि उस संग्रह से अंतिम आइटम प्राप्त करेगी। तो आपके पास पहले से ही आपकी मेमोरी (खराब) पर लोड की गई तालिका का सारा डेटा होगा। आपको बस `DB :: तालिका ('आइटम') -> नवीनतम () -> पहला (); दृश्य के पीछे यह` ऑर्डरबाई ($ कॉलम, 'डीएससी') का उपयोग करना चाहिए और पहला रिकॉर्ड लाना चाहिए।
अनुज श्रेष्ठ


1

यदि आप वास्तविक पंक्ति की तलाश कर रहे हैं जिसे आपने लारावेल 3 और 4 के साथ डाला है जब आप एक नए मॉडल पर एक क्रिया saveया createक्रिया करते हैं जैसे:

$user->save();

-या-

$user = User::create(array('email' => 'example@gmail.com'));

तब डाला गया मॉडल उदाहरण वापस कर दिया जाएगा और आगे की कार्रवाई के लिए इस्तेमाल किया जा सकता है जैसे कि उपयोगकर्ता के प्रोफाइल पेज पर पुनर्निर्देशित करना अभी बनाया गया है।

कम वॉल्यूम सिस्टम पर अंतिम सम्मिलित रिकॉर्ड कार्यों की खोज करना लगभग सभी समय काम करेगा लेकिन यदि आपको कभी भी आवेषण करना है तो उसी समय आप गलत रिकॉर्ड खोजने के लिए क्वेरी को समाप्त कर सकते हैं। यह वास्तव में एक लेनदेन प्रणाली में एक समस्या बन सकता है जहां कई तालिकाओं को अद्यतन करने की आवश्यकता होती है।


1

किसी भी तरह उपरोक्त सभी मुझे लार्वा 5.3 में काम करने के लिए नहीं लगता है, इसलिए मैंने अपनी समस्या का उपयोग करके हल किया:

Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();

आशा है कि किसी को जमानत देने में सक्षम हूं।


1

उपयोग करें Model::where('user_id', $user_id)->latest()->get()->first(); यह केवल एक रिकॉर्ड लौटाएगा, यदि नहीं मिला तो वापस आ जाएगा null। आशा है कि यह मदद करेगा।


0

यदि तालिका में दिनांक फ़ील्ड है, तो यह ( User::orderBy('created_at', 'desc')->first();) सबसे अच्छा समाधान है, मुझे लगता है। लेकिन कोई दिनांक फ़ील्ड नहीं Model ::orderBy('id', 'desc')->first()->id;है, सबसे अच्छा समाधान है, मुझे यकीन है।


0

ध्यान दें कि last(), latest()नियतात्मक आप देख रहे हैं एक अनुक्रमिक या घटना / आदेश दिया रिकार्ड के लिए नहीं हैं। पिछले / हाल के रिकॉर्ड में सटीक समान created_atटाइमस्टैम्प हो सकता है, और जो आपको वापस मिलता है वह नियतात्मक नहीं है। तो करते हैं orderBy(id|foo)->first()। अन्य विचार / सुझाव कि किस प्रकार निर्धारक होना स्वागत योग्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.