miladtajare
3 سال پیش توسط miladtajare مطرح شد
16 پاسخ

خروجی فیلتر شده از دیتابیس laravel . eloquent

سلام وقت همگی بخیر /
من یه جدول دارم به عنوان مثال که لیست کالا ها هستش و هر کالا برای خودش یه ورژن داره در کنارش
یعنی مثلا ممکنه که از مداد 5 تا باشه تو این جدول اما باید اخرین شماره این مداد یا همون اخرین ورژن رو نشون کاربر بده /
و حالا فقط قضیه یک کالا نیست باید لیست همه کالا هارو در بیارم و چک بشه که حتما اخرین ورژن اون کالا هم باشه / نمیخوام بخونم و بعد بگم کدوم اخرین ورژنه
**queryهست مستقیم از دیتابیس بخونم اینو؟ البته اینو در لاراول و eloquent میخوام ن query خام****

@mohaligateway
@AliValinejad
@hesammousavi
@ali.bayat
@mehdi.shahabbasian


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
-1

متد distinct در لاراول معمولا با orderBy به خوبی کنار نمیاد
پس میتونی ابتدا id ها رو بگیری و بعد داخل کوئری بعد از whereIn و paginate و orderBy استفاده کنی

$ids = Hepler_table::distinct('PrjNumber')->pluck('id','PrjNumber')->values();
$products = Hepler_table::whereIn($ids)->orderByDesc('VersonsID_list')->paginate(8);

moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش مطرح شد
0

سلام
درود بر شما
شماره سریال یا همون ورژن مد نظر شما به صورت عددی ورزن بندی شده یک دو سه .... هست. اگر به این شکل باشه می تونید از sortby استفاده کنید.
@milad.pc.tajare


miladtajare
@milad.pc.tajare 3 سال پیش مطرح شد
0

توضیح تصویر رو وارد کنید

داخل این عکس ببینید میخوام از اون که 81 یکیش بیاد و اون بزرگتره
@@mohaligateway


miladtajare
@milad.pc.tajare 3 سال پیش مطرح شد
0

@mohaligateway
و بقیه خروجی ها هم که باشه دیگه که 1 خورده / و ممکنه مثل این اولی که 81 بازم باشه و با ورژن های بزرگ تر


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

متن سوالت رو کاملا متوجه نشدم
با این ۲ فیلدی که توی جدول داری، چطوری میخواهی داده ها رو بگیری؟


miladtajare
@milad.pc.tajare 3 سال پیش مطرح شد
0

@ali.bayat
ممنون از پاسختون
خب این به عنوان مثاله /
عکس رو ببینید
فکر کنید سمت چپی ها id یک کالا یا هر چی هستن
و سمت راستی ها ورژن اونا/ ورژن هر کالا
حالا میخوام که از هر کالا یکی رو برگردونه / و همینطور اخرین ورژنش رو


miladtajare
@milad.pc.tajare 3 سال پیش مطرح شد
0

یعنی الان باید خروجی یک از شماره های 81 باشه و اونی که شماره VersonsID_list بزرگتره
@ali.bayat


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

با الکوئنت در واقع کار بسیار راحتیه و در کنارش کالکشن ها هم هستند
کوئری زیر رو امتحان کن:

Model::select('*')
    ->distinct('PrjNumber')
    ->orderByDesc('VersionsID_list')
    ->get()
    ->unique('PrjNumber');

miladtajare
@milad.pc.tajare 3 سال پیش مطرح شد
0

@ali.bayat
این درست جواب میده / اما نباید get بشه / paginate در ادامه استفاده شده که نمیزاره..راه حلی برای این هست؟


miladtajare
@milad.pc.tajare 3 سال پیش آپدیت شد
0

و به جز صفحه بندی یه سری where , .. هم دارم / که در ادامه میگه وقتی get میکنی یعنی خوندی دیگه نمیشه از اینا استفاده کرد / از این توابع صفحه بندی یا هر دستور دیگه eloquent
راهی هست همین دستوری که بالا فرستادید درسته اما با این شرایط؟
@ali.bayat
@hesammousavi


miladtajare
@milad.pc.tajare 3 سال پیش مطرح شد
0

و یه سوال دیگه این Get که مابین ستورات شماست
اگر که تعداد رکورد بالا بره / مثلا 100.000 یا هر چی / خیلی بیشتر بشه کار میکنه؟ احساس میکنم مشکل ساز بشه؟
نمیشه/؟
@ali.bayat
@hesammousavi


miladtajare
@milad.pc.tajare 3 سال پیش آپدیت شد
0

کاری که من برای این کردم اینه که اول اومدم از همین

       $ids =  Hepler_table::select('*')
        ->distinct('PrjNumber')
        ->orderByDesc('VersonsID_list')
        ->get()
        ->unique('PrjNumber')->pluck('id');

اینو گرفتم / و بعدش اومدم where , ...نوشتم

$Hepler_table = new Hepler_table();
$Hepler_table = $Hepler_table->whereIn('id',$ids);
$Hepler_table = $Hepler_table->latest('id')->paginate(8);

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

@ali.bayat @hesammousavi


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

وقتی از get استفاده میکنیم از اونج به بعد خروجیمون Collection میشه برا همین دیگه paginate رو نداریم
و الان unique که آخر کار هست در واقع متد کالکشن هست و در سطح کوئری اعمال نمیشه.

حالا اگر اون متغیر ids قرار باشه داده زیادی برگردونه، خوب ممکنه با حجم داده بالا کمی کند عمل کنه. پس باید unique بودن رو در سطح کوئری چک کنی


miladtajare
@milad.pc.tajare 3 سال پیش مطرح شد
0

خب الان راهی هست که هم تکراری ها حذف بشه و هم بزرگترین ورژن رو برگردونه ولی به کالکشن تبدل نشه؟ که بشه روش صفحه بندی رو زد یا هر شرط دیگه ای رو؟
@ali.bayat


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
-1

متد distinct در لاراول معمولا با orderBy به خوبی کنار نمیاد
پس میتونی ابتدا id ها رو بگیری و بعد داخل کوئری بعد از whereIn و paginate و orderBy استفاده کنی

$ids = Hepler_table::distinct('PrjNumber')->pluck('id','PrjNumber')->values();
$products = Hepler_table::whereIn($ids)->orderByDesc('VersonsID_list')->paginate(8);

miladtajare
@milad.pc.tajare 3 سال پیش مطرح شد
0

@ali.bayat
ممنونم ازتون ، و وقتی که گزاشتید / خدا خیرتون بده


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

موفق باشی..


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

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