سید حسین موسوی
سید حسین موسوی
خواندن ۷ دقیقه·۴ سال پیش

مشکل دیتاتیبل در لاراول و استفاده از پکیج

سلام ?

این اولین نوشته من در ویرگوله ، و دوست دارم در مورد آخرین مشکلی که داشتم باهاتون صحبت کنم.

من دارم یک پروژه از اون پروژه هایی که خیلی وقت برده و اینگار قرار نیست تغییرات کارفرما تموم بشه انجام میدم و خب سبب شده خیلی مواردی که دوست دارم و وقت میکنم هم روی پروژه تست کنم البته قبل اعمال روی سرور همه چی بررسی میکنم ، خلاصه که به یک چالش جالبی خوردم و چند ماه پیش یک پکیجی برای حل این مشکل پیدا کردم!

اون پکیج پکیجی نبود به جز Laravel DataTables ، من چند ماه پیش این پکیج نصب کردم و خب اصلا راضی نبودم ، کلا درکش نمیکردم میگفتم چرا باید از پکیج اونم برای ساده ترین چیز یعنی نمایش جدول استفاده کنم؟ اصلا چه معنا داره نه من مقاومت میکنم ، چون الان جایی که کار میکنم ، مدیر فنی دسترسیم یک مدت به خاطر نصب پکیج محدود کرده بود ? خلاصه که آگاه شدم و دیگه از پکیج تا میتونم استفاده نمیکنم!

ولی چی شد که اینجا اینکارو کردم؟

تصویر پروژه ای که دارم روش کار میکنم!
تصویر پروژه ای که دارم روش کار میکنم!

خب همونطور که میبینید دیتاتیبل عظیمی ، که فقط صرف تست با اطلاعات فیک نزدیک ۱۰۰۰ تا داده برای بخش یوزر ها ساختم ! دقیقا چه اتفاقی میفته؟

خب به صورت پیش‌فرض همه ما می‌دونیم که باید این حجم از اطلاعات Paginate کنیم چون واقعا لود ۱۰۰۰ داده در یک لحظه برای سیستم واقعا سنگینه تازه که این اطلاعات فیکه و وقتی پروژه به مرحله اصلیش برسه قطعا بار خیلی از این سنگین تر میشه؟

خب اینجا چه موضوعی مطرح میشه؟ اگر بخواهم از صفحه‌بندی استفاده کنم باید بیخیال ۱۰۰۰ تا داده بشم ! چون زمانی که به فرض از کد زیر استفاده میکنم:

Subscriber::all()->paginate(10)

الان اگر این کد من برای پروژم بزنم صرفا از اون هزار نتیجه ۱۰ تاشو نشون میده و خب چون دیتاتیبل paginate لاراول درک نمیکنه، در نتیجه باید بیاید با استفاده از جی‌کوئری یا Vue یا React یا هر کتابخانه یا فریمورک جی اسی درخواست ایجکس بزنید و صفحه های دیگر دریافت کنید که واقعا کد چرک و کثیفی میشه!

راه‌حل مشکل؟ استفاده از پکیج

تحقیقات انجام شد و باز با سرچ به پکیج لاراول دیتاتیبل خوردم ، قبلا چند بار این پکیج نصب کرده بودم ولی همش باهاش مشکل داشتم ?

این دفعه دیگه چون کار گیر بود و دوست داشتم مشکل حل کنم گفتم بیخیال بذار بریم تمام تلاشمونو بکنیم!

خب توی تصویر بالا اگر ببینید سه تا دکمه هست که لینک داره که اکشن هامون هستن و یک نام هست که لینک شده و با توجه به اینکه استفاده از api و استفاده از کامپوننت x-option که برای چاپ این سه تا دکمه نوشتم کار سخت میکرد و زمانی که از پکیج استفاده میکردم با صحنه زیر روبرو می شدم!

خب، همونطور که میبینید لینک ها رو به این صورت نشون میده! این خیلی بده و با توجه به داکیومنت افتضاحی که این پکیج داره من مجبور شدم کل فایل های گیت هابشو بگردم و کلی سرچ کنم تا بفهمم این چطور درست میشه.

کد بالا در واقع جایگزین اینکه یک بلید بسازید و با foreach داخل اطلاعات بگردید و تک تک ستون ها رو چاپ کنید میشه! ولی خب اینجا باز یک سوالی پیش میاد

اگر من بخواهم قبل و بعد یک value یکی از ستون ها یک کاری کنم مثلا یک لینک بذارم اینجوری که نمیشه? پس باید چجور اینکارو کنم؟

قبلا راحت میومدم با کد زیر هر کاری میخواستم میکردم به طور مثال نگاه کنید

اینجا اومدم حتی از scope برای یک ستون استفاده کردم ولی با پکیج دیتاتیبل دیگه از این خبرا نیست‌، خب بازم راهکار هست مثلا بیام داخل مدل Payment مثلا expenses که یک رابطس تعریف کنم چطور چاپ کنه ولی خب من نمیخواستم همه جا این شکلی بشه

حتی جالب تر از اون این x-option که میاد اکشن های حذف و ویرایش و نمایش برای کاربر نشون میده ? خدایا حالا اینو با پکیج چطور باید نمایش بدم؟

خب مشکل اول که نمایش لینک بود چطور حل شد؟

خیلی ساده اگر انگلیسیم یکم قوی تر بود شاید چند ماه پیش از این پکیج استفاده میکردم ولی واقعا داکیومنتش بده!

یک چیزی در پکیج هست به اسم rawColumns که این میاد و ستون هایی که قراره تغییراتی داشته باشن به دیتاتیبل میفهمونه. به این صورت

خب بعد از استفاده از این متد به راحتی تگ ها هم نمایش داده میشن و برای نمایش تگ لینک یا هر کار دیگه باید یکم از php خام استفاده کنید و دیگه خبری از blade عزیز نیست! که توی addColumn که برای coordinator_id استفاده کردم می‌تونید ببینید.

البته برای این که باز Laravel DataTables بفهمه که شما قراره یک کاری با این فیلد بکنید نیازه که طبق تصویر سوم از بالا اون ستون به این صورت تعریف کنید

Column::computed('coordinator_id') ->exportable(true) ->printable(true) ->orderable(true) ->width(60) ->addClass('text-center') ->title('إسم المنسق'),

اینجوری میفهمه که این ستون قراره یک سری محاسبات و اتفاقی توش بیوفته و همینجوری نمیاد از دیتابیس بخونه و بذاره و تمام!

در مورد مشکل دوم یعنی نمایش یک کامپوننت هم خیلی سعی کردم چیزی پیدا کنم که وقتی کد php خام میزنی بتونی از blade استفاده کنم فرض کن توی کنترولر بیای و بزنی

return <x-option></x-option>

چی از این بهتر! ولی خب این دقیقا نقض یکی از مهمترین اصول سالید هست ، میدونید که من چقدر به این اصول پایبندم ?? ولی در کل امید داشتم با استفاده از دیرکتیو هایی که بلید در اختیارمون گذاشته بتونیم همچین کاری کنیم که نشد!

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

خیلی راحت همون کاری که قبلا میکردیم البته این دفعه با هلپر فانکشن \view داخل متد دیتاتیبل انجام دادم که این مشکل هم حل شد????

خدا رو شکر واقعا بخیر گذشت ولی باز مطمینم قابلیت بهتر شدن داره.

الان به یک چالش دیگه هم خوردم چون من برای بعضی از مدل ها SoftDeletes استفاده میکنم پس باید توی این دیتاتیبل لعنتی ? :) تا الان داشتم ازش تعریف میکردما ? اره خلاصه باید onlyTrashed() ها رو داخلش نشون بدم ولی نمیخواهم یک DataTable دیگه بزنم و از همینی که ساختم یک جورایی استفاده کنم و زمانی که به صفحه حذف شده ها رفت اطلاعات حذف شده ها رو نمایش بده و حتی بتونه Restore کنه.

حالا قطعا این چالش هم حل میشه ولی اگر کسی از دوستان راجبش اطلاعات داشت ممنون میشم با من هم اشتراک بذاره❤️❤️❤️

ممنونم از وقتی که گذاشتید امیدوارم مورد استفاده‌تون قرار گرفته باشه

لینک لینکدین من : گاهی دوستان لطف میکنن نظرات خوبی برای پستایی که مینویسم میدن و شما هم میتونید استفاده کنید : https://www.linkedin.com/in/hu3ein/




لاراولlaravelپکیج لاراول
من سید حسین موسوی هستم - توسعه دهنده و عاشق کارآفرینی و فروش دو سالیه که لاراول کار میکنم و یکم سابقه تدریس دارم و سعی میکنم از تجربیات دیگران در وهله اول و در وهله دوم تجربیات خودمو انتقال بدم!
شاید از این پست‌ها خوشتان بیاید