برای گرفتن همهی آیتمهای Collection لاراول، toArray صدا نزن
خلاصهٔ کاملتر
کلاس Collection لاراول عالیه و احتمالاً توی همهی پروژههات ازش استفاده میکنی. یه کاری که زیاد لازم میشه، تبدیل دوبارهی کالکشن به یه آرایهی معمولیه. مثل خیلیها، شاید وسوسه بشی برای این کار toArray() رو صدا بزنی. اما این ممکنه متد اشتباهی باشه.
روی یه کالکشن ساده، toArray همونطور که انتظار داری کار میکنه:
$collection = collect([1, 2, 3]);
$collection->toArray(); // returns [1, 2, 3]اما حالا همون متد رو روی یه کالکشن از مدلهای Eloquent امتحان کن:
$usersCollection = User::all();
$usersArray = $usersCollection->toArray();اینجا یه اتفاق غیرمنتظره میافته. وقتی نتیجه رو نگاه کنی، میبینی که خودِ مدلهای داخل کالکشن هم به آرایه تبدیل شدن. یعنی toArray بهصورت بازگشتی پایین رفته و هر مدل Eloquent رو هم به آرایه ریخته. این شاید دقیقاً چیزی نباشه که میخواستی.
راهحل سادهست: اگه میخوای فقط همهی عناصرِ کالکشن رو بهصورت یه آرایه بگیری، در حالی که خودِ آبجکتهای مدل دستنخورده میمونن، بهجای toArray باید متد all() رو صدا بزنی. تفاوت ظریفه ولی مهمه: toArray همهچیز رو تا ته به آرایه تبدیل میکنه، اما all فقط لایهی بیرونیِ کالکشن رو باز میکنه و خودِ آیتمها رو همونطور که هستن نگه میداره.
نکات کلیدی:
- روی کالکشنِ مدلهای Eloquent، toArray خودِ مدلها رو هم به آرایه تبدیل میکنه
- روی یه کالکشن سادهی اعداد، toArray و all تفاوتی نشون نمیدن
- اگه فقط آیتمها رو با مدلهای دستنخورده میخوای، all را صدا بزن
- تفاوت ظریفه اما میتونه باعث باگ بشه




