مهدی
2 سال پیش توسط مهدی مطرح شد
1 پاسخ

مرتب کردن رکوردها بر اساس یک لیست شناسه ها در لاراول

سلام دوستان
یه چالشی دارم اینکه اگه بخوام رکوردهارو موقع get کردن با استفاده از ORM لاراول بر اساس یک لیستی از ID ها sort کنم چطور باید اینکارو بکنم؟!!!!!!!

منظورم اینه :
فرض کنید یه جدولی داریم بنام users که داخلش 100 رکورد وجود داره و هر رکورد هم یه ID یونیک داره
ویه آرایه ای از ID هارو هم داریم.
آرایه زیر :

$ids = [4,1,2,3]

حالا من میخوام لیست یوزرهارو بگیرم ولی فقط یوزرهایی که اولا در آرایه ids وجود دارن وثانیا طبق همون ترتیبی که در این آرایه لیست شدن.

User::whereIn('id' , $Ids)->sortBy('id',$ids)->get();

آیا راه حلی به ذهن تون میرسه برای انجام اینکار ؟


ثبت پرسش جدید
مهدی
تخصص : توسعه دهنده
@mehdi539 2 سال پیش مطرح شد
2

پاسخ رو خودم پیدا کردم و اینجا قرار میدم تا کسانیکه به مشکل برخوردن استفاده کنن
برای اینکار دو تا راه حل رو پیدا کردم:

روش اول :
استفاده از تابع sortBy

$users = User::whereIn('id', $Ids)->get()
   ->sortBy(function($user, $key) use($ids) {
         return array_search($user->id, $ids);
      });

می تونید برای اطلاعات بیشتر به داکیومنت خود لاراول مراجعه کنید.

فقط توجه داشته باشید که تابع sortBy() باید روی یک کالکشن عمل کنه، به این معنی که تابع get() باید قبل از اون بیاید.

روش دوم :
استفاده از تابع orderByRaw

$ids = [2,1,3];
$ids_ordered = implode(',', $ids);
User::whereIn('id', $ids)->orderByRaw("FIELD(id, $ids_ordered)")->get();

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام