সারণীতে শেষ সারিটি নির্বাচন করুন


163

আমি আমার টেবিলের মধ্যে প্রবেশ করা শেষ ফাইলটি পুনরুদ্ধার করতে চাই। আমি জানি যে পদ্ধতিটি first()বিদ্যমান এবং আপনাকে টেবিলে প্রথম ফাইল সরবরাহ করে তবে আমি কীভাবে শেষ সন্নিবেশ পেতে জানি না।


আরো দেখুন stackoverflow.com/questions/33321447/... কিভাবে একটি একটি বিদ্যমান সম্পর্ক (hasMany) সাজাতে
তারেক আদম

লারাভেল সম্পর্কে জিজ্ঞাসা ও উত্তর দেওয়া এমন কারও পক্ষে এটি। মনে রাখবেন যে আপনি কোন লারাভেল সংস্করণটির কথা বলছেন তা উল্লেখ করা গুরুত্বপূর্ণ। সাধারণত সংস্করণ 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();

লারাভেল ৫.7 এবং এর পরে

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

এটি আপলোডের সময়, উতরাইয়ের আদেশের মাধ্যমে ফাইল সারণিতে সারিগুলি অর্ডার করবে এবং প্রথমটি নেবে। এটি সর্বশেষতম আপলোড করা ফাইল হবে।


15
orderByorder_by
লারাভেল

9
আপনি যখন ওআরএম ব্যবহার করেন, এটি সঠিক উপায়:User::orderby('created_at', 'desc')->first();
ক্যাস ব্লিম

1
orderBy('created_at', 'desc')
লারাভেল

9
আপনি তৈরি_এ কলামটি কেন ব্যবহার করছেন? প্রাথমিক কী আইডি ব্যবহার করতে আরও দ্রুত। Files::orderBy(id', 'desc')->first();তারিখ অনুসারে লারাভেল ৫.x অর্ডার আরও দীর্ঘক্ষণ কাজ করে কারণ তারিখটি স্ট্রিং এবং সম্ভবত সূচিযুক্ত নয়। প্রাথমিক কীটি সূচকযুক্ত এবং অতি দ্রুত কাজ করে। এমনকি যদি তৈরি_এটি সূচকযুক্ত হয় তবে এটি প্রাথমিক সূচীর ক্ষেত্রে আইএনটি নয় বরং সূচকযুক্ত স্ট্রিং। সূচকের স্ট্রিংয়ের পারফরম্যান্স কম।
কোরবেনডালাস

4
@ কোরবেনডালাস মন্তব্যটির উত্তর হওয়া উচিত কারণ কখনও কখনও orderBy('created_at', 'desc')আপনাকে শেষ সারিটি দেয় না। উদাহরণ: 3 টি সারিতে একই টাইমস্ট্যাম্প মান থাকতে পারে এবং আপনার সাথে orderBy('created_at', 'desc')3
টির

111

বক্সের বাইরে লারাভেলের দেওয়া সর্বশেষ সুযোগটি ব্যবহার করুন।

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

এইভাবে আপনি সমস্ত রেকর্ড পুনরুদ্ধার করছেন না। অর্ডার করার জন্য একটি দুর্দান্ত শর্টকাট।


7
নোট করুন যে এই পদ্ধতিটি created_at($timestamps = true)
মডেলটিতে

আমি লারাভেল 5.7 ব্যবহার করছি এবং একটি মডেলটিতে এটি করার চেষ্টা করছি এখনও আমার জন্য সমস্ত রেকর্ড পুনরুদ্ধার করে।
সিজে ডেনিস

1
মনে রাখবেন যে একই সেকেন্ডের মধ্যে যদি আপনার একাধিক রেকর্ড যুক্ত থাকে তবে তৈরি করা_আর সময়গুলি এই রেকর্ডগুলির জন্য একই হবে এবং অতএব সর্বশেষ () দ্বারা ফিরিয়ে দেওয়া রেকর্ডটি আপনি প্রত্যাশা করেছেন এমন রেকর্ড নাও হতে পারে।
F3CP

মনে রাখবেন যে আপনার একটি 'made_at' কলামের প্রয়োজন নেই। আপনি কোন কলামটি সর্বশেষ চান তা উল্লেখ করতে পারেন। উদাহরণস্বরূপ: মডেল :: সর্বশেষ ('তারিখের কলাম') -> প্রথম ();
টম

যদি দুটি সারি 1 সেকেন্ডের মধ্যে সন্নিবেশ করা হয় (প্রকৃতপক্ষে ইউনিট পরীক্ষায় সমস্যা দেখা দেয়) তবে এটি আসল শেষ সারিটি পেতে ব্যর্থ হতে পারে।
মরিচ

75

আপনি কখনও স্পষ্টত, লারাভেলের ডিফল্ট ওআরএম ব্যবহার করছেন কিনা তা আপনি কখনও উল্লেখ করেননি। আপনি যদি হন তবে ধরা যাক আপনি ব্যবহারকারীর টেবিলের সর্বশেষ এন্ট্রি পেতে চান, তৈরি_এটি দ্বারা, আপনি সম্ভবত নিম্নলিখিত হিসাবে এটি করতে পারেন:

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বৈশিষ্ট্যটি ফিরিয়ে দেওয়া
ivcandla

5
এই পদ্ধতিটি আসলে খারাপ। আপনি ডিবি স্তর হিসাবে না করে পিএইচপি এক্সিকিউশন ব্যবহার করে শেষ কাঁচা আনছেন। টেবিলে যদি কয়েক মিলিয়ন কাঁচা থাকে তবে আপনি জানেন যে এটি কতটা অদক্ষ হতে পারে?
ভাস্কর দবি

এটি করার সেরা উপায় এটি। - না! কখনও ছিল না, কখনও হবে না। আপনি যা প্রয়োজন কেবল তার পরিবর্তে আপনি সমস্ত সারি লোড করছেন ।
রেনি রথ

11

এটা চেষ্টা কর :

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

1
এটি একাধিক সারি ফিরবে। তার একক সারি দরকার। প্রথম () তাকে অর্ডারবাই () ধারা দিয়ে সহায়তা করবে।
তাহির আফ্রিদি

যদি দুটি সারি 1 সেকেন্ডের মধ্যে সন্নিবেশ করা হয় (প্রকৃতপক্ষে ইউনিট পরীক্ষায় সমস্যা দেখা দেয়) তবে এটি আসল শেষ সারিটি পেতে ব্যর্থ হতে পারে।
মরিচ

1
একটি বৃহত টেবিলে এটি মেমরির ব্যতিক্রমের কারণ ঘটবে কারণ @ তাহিরআফ্রিদী উল্লিখিত হিসাবে এটি সমস্ত সারি মেমরিতে লোড করবে।
রিহার্ডস

6

আপনি ফিল্ড করতে চান এমন ফিল্ডের সাথে লারাভেলের দেওয়া সর্বশেষ সুযোগটি আপনি ব্যবহার করতে পারেন, আসুন বলি এটি আইডির মাধ্যমে অর্ডার করা হবে, তারপরে:

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

সুতরাং এইভাবে, আপনি created_atলারাভেলে ডিফল্টরূপে মাঠে অর্ডারটি এড়াতে পারবেন ।


5

শেষ রেকর্ড বিশদ পেতে, নীচের কোডটি ব্যবহার করুন:

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

এটি ব্যবহার করবেন না। এটি একটি খুব খারাপ অনুশীলন যা সর্বশেষ স্কোপটি রয়েছে () এটি সর্বশেষ sertedোকানো সারিতে সরাসরি অ্যাক্সেস সরবরাহ করে।
ওয়ার্কিং পিগ

3

লারাভেল x.x এ এটি করার আরেকটি অভিনব উপায় (অনিশ্চিত তবে অবশ্যই 5.x এর জন্যও কাজ করা উচিত):

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

আপনি ক্ষেত্রগুলি অ্যাক্সেস করতে পারেন:

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


লারাভেল ৫.৮ এ আমার জন্যও কাজ করে, আপনার দেখার আগে উত্তর পোস্ট করে
Dazzle

1
লারাভেল কীভাবে এই দৃশ্যের পিছনে কাজ করে এবং বৃহত্তর ডেটা সেটের জন্য এটি কেন বিপজ্জনক, তার একটি সামান্য ব্যাখ্যা, get()পদ্ধতিটি সমস্ত সংগ্রহ থেকে your_tableসংগ্রহ last()করবে এবং সংগ্রহ তৈরি করবে এবং পদ্ধতিটি সংগ্রহ থেকে শেষ আইটেমটি পাবে। সুতরাং আপনার টেবিলে থাকা সমস্ত ডেটা ইতিমধ্যে আপনার স্মৃতিতে লোড হবে (খারাপ)। আপনার কেবলমাত্র `ডিবি :: টেবিল ('আইটেম') -> সর্বশেষ () -> প্রথম (); the দৃশ্যের পিছনে এটি অর্ডার বাই ($ কলাম, 'ডেস্ক') perform ব্যবহার করুন এবং প্রথম রেকর্ডটি আনুন।
অনুজ শ্রেষ্ঠ


1

আপনি যদি নতুন মডেলটিতে কোনও saveবা createক্রিয়া সঞ্চালনের সময় লারাভেল 3 এবং 4 দিয়ে সবেমাত্র সন্নিবেশিত প্রকৃত সারিটি সন্ধান করছেন :

$user->save();

-অথবা-

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

তারপরে modelোকানো মডেল উদাহরণটি ফিরে আসবে এবং সুনির্দিষ্টভাবে তৈরি করা ব্যবহারকারীর প্রোফাইল পৃষ্ঠায় পুনঃনির্দেশকরণের মতো আরও ক্রিয়া হিসাবে ব্যবহার করা যেতে পারে।

সর্বনিম্ন ভলিউম সিস্টেমে সন্নিবেশিত রেকর্ডের কাজগুলি প্রায় সময়ই কাজ করবে তবে আপনাকে যদি একই সময়ে সন্নিবেশ করতে হয় তবে আপনি ভুল রেকর্ডটি সন্ধানের জন্য অনুসন্ধান করতে পারেন। এটি ট্রানজেকশনাল সিস্টেমে সত্যই সমস্যা হয়ে উঠতে পারে যেখানে একাধিক সারণী আপডেট হওয়ার প্রয়োজন।


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()। কীভাবে প্রতিরোধমূলক হতে হবে সে সম্পর্কে অন্যান্য ধারণা / পরামর্শ স্বাগত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.