پیش از پرداختن به چگونگی تعامل با پایگاه داده در لاراول، می بایست یکی از ویژگی های لاراول، به نام Colletion ها را معرفی کنیم. کلاس Illuminate\Support\Collection در لاراول، مجموعه ای از متدها را برای کار بر روی آرایه فراهم می کنند. در کنار اینکه این متدها برای کار بر روی آرایه ها فراهم شده اند، لاراول درون ORM خود (Eloquent) از آنها نیز کمک گرفته است تا بتوانیم فیلترهایی را بر روی خروجی کوئری های پایگاه داده انجام دهیم.

آغاز کار با Collection ها در لاراول

برای ایجاد Collection باید یک helper به نام collect را به کار ببریم. collect یک آرایه نام یک متغیر آریه ای را دریافت و سپس آن را به Collection تبدیل می کند. در این نوشته نمی خواهیم کنترل گرها یا Route برای نوشتن Collection را به کار بگیریم پس به جای آنها از خط فرمان کمک می گیریم، بنابراین نخستین کار این است که در خط فرمان به دایرکتوری پروژه لاراول رفته و سپس دستور زیر را انجام دهید.

در کدهای زیر نخست یک آرایه انجمنی به نام users$ را نوشته ایم که دارای سه کلید name و age و from است. سپس این آرایه را به ()collect فرستاده ایم و نتیجه برگشتی آن یک Collection است، در متغیری به نام collection$ نگهداری می شود. بنابراین از این پس می توان با متغیر collection$ به متدهای کلاس Illuminate\Support\Collection دسترسی داشته باشیم.

در کد زیر نخست یک آرایه از آرایه هی انجمنی به نام users$ را نوشته ایم که هر آرایه انجمنی آن دارای سه کلید name و age و from است. سپس این آرایه را به ()collect فرستاده ایم و نتیجه برگشتی آن یک Collection است، در متغیری به نام collection$ نگهداری می شود.

متد ()map

متد ()map یک تابع بی نام را به عنوان ورودی دریافت می کند و سپس این تابع بی نام را در یک حلقه، بر روی تک تک المان های Collection اجرا می کند. خود تابع بی نام نیز می تواند بر پایه کاربردش، هر چند ورودی دریافت کند. در دنباله دو نمونه را نشان می دهیم که در نمونه نخست، تابع بی نام دو آرگومان ولی در دومی تنها یک آرگومان را دریافت می کند.

در کد زیر می خواهیم بوسیله تابع ()ucfirst کاراکتر نخست مقدار تمامی کلیدهای name را به حرف بزرگ تبدیل کنیم. همانگونه که می بینید، تابع بی نام دو آرگومان دریافت کرده است، آرگومان نخست را value$ و آرگومان دوم را key$ نامگذاری کرده ایم. در این نمونه، در هر تکرار value$ یکی از آرایه های انجمنی درون Collection بالا است و کلید نیز، کلید name درون هر کدام از آریه های انجمنی است. که آن را آشکارا مشخص کرده ایم. پس از اجرای کد، درون یک حلقه، تک تک حرف نخست مقدار همه کلیدهای name به حرف بزرگ تبدیل می شود که در شکل زیر می توانید ببینید.

در کد زیر می خواهیم بوسیله تابع ()strtoupper  می خواهیم تمامی عنصرهای رشته ای درون آرایه فرستاده شده به متد ()map را به حروف بزرگ تبدیل کنیم. در مورد کد زیر، چندین نکته است

  • آرایه فرستاده شده تو در تو نیست و تنها یک آرایه معمولی با سه عنصر است که دو تای نخست رشته و سومی null است.
  • به جای آنکه همانند بالا آرایه را درون یک متغیر ریخته و سپس نام متغیر را به متد ()map بفرستیم، اینجا یکباره خود آرایه را به ()collect فرستاده شده است.
  • به جای نوشتن تابع بی نام و نگهداری آن درون یک متغیر، تعریف خود تابع را یکباره به عنوان ورودی به متد ()map فرستاده ایم ولی توصیه می شود برای خوانی بهتر، تابع بی نام را درون یک متغیر ریخته و سپس نام متغیر را به متد ()map بفرستیم.
  • آرایه بی نام اینجا تنها یک آرگومان دارد، چون خود آرایه فرستاده شده به ()collect تنها یک آرگومانی معمولی و نه تو در تو است. توجه کنید که متد ()map تنها یک ورودی دریافت می کند و آن هم تعریف تابع بی نام یا نام متغیری است که به تعریف تابع بی نام اشاره دارد.
  • همچنین می بینید که می توانیم زنجیر گونه متد ()collect و دیگر متدها را نیز فراخوانی کنیم.

شکل زیر خروجی کد بالا را نشان می دهد و همانگونه که می بینید دو عنصر نخست آرایه به حرف های بزرگ تبدیل شده اند ولی سومی عنصر چون رشته نبود (مقدار null)، پس از آن صرف نظر شده است.

متد ()reject 

در خروجی بالا مشخص است که یک مقدار رشته خالی در خروجی ()map پدیدار شده است که بی خود و بی فایده است و می بایست از ذخیره شده آن در متغیر collection$ پیش گیری کرد. در این چنین مواقعی، باید تابع ()reject را به کار ببریم. این تابع نیز یک تابع بی نام دزیافت می کند. در کد زیر، تابع بی نام فرستاده شده به ()reject یک آرگومان دریافت می کند که آن درهر تکرار برابر با یکی از عنصرهای خروجی ()map است. سپس بوسیله متد ()empty بررسی می کند که آیا مقدار خروجی ()map برابر با null است و اگر اینگونه باشد، پس آن را بیرون می اندازد.

کد زیر الگوی بالا را به گونه ساده تری نشان می دهد. همانگونه که می بینید آرایه و هر کدام از تابع های بی نام را درون متغیرهای مجزا نوشته ایم و سپس زنجیروار هر کدام از آنها را به هر یک از متدها فرستاده ایم. این کار خوانایی بهتری را همراه خودش دارد و از بهم ریختگی کد پیش گیری می کند.

دانلود Laravel Collections Methods Part1