Eloquent: چگونه نتایج را با Mutator Attribute مرتب کنیم؟

اخیرا با مساله‌ای مواجه شدم که می‌خوام اون و راه حلش رو بگم. لاراول یک ویژگی خاص به نام Mutators دارد که باعث می‌شود شما بتوانید فیلدهایی اضافی که خودکار محاسبه می‌شوند، در مدل Eloquent خود تعریف کنید. اما orderBy برای مرتب سازی روی این فیلدها کار نمی‌کند، بنابراین برای مرتب‌سازی چه باید کرد؟

ابتدا یادآوری کنم که چگونه کار می‌کنند. فرض کنید یک مدل Client.php و فیلدهای first_name و last_name را داریم. می‌توانید full_name را به صورت زیر تعریف کنید:


function getFullNameAttribute()
{
  return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];
}

و بعد از آن، وقتی $clients = Client::all(); را اجرا می‌کنید، می‌توانید از آن به صورت زیر استفاده کنید:


@foreach ($clients as $client)
  {{ $client->full_name }}
@endforeach

به همین سادگی.

اما اگر بخواهید نتایج را بر اساس full_name مرتب کنید، چه پیش خواهد آمد؟ خب orderBy خطا خواهد داد.


$clients = Client::orderBy('full_name')->get(); // doesn't work

راه حل خیلی ساده‌ست. ما باید نتایج را بعد از آنکه گرفتیم، مرتب کنیم.


$clients = Client::get()->sortBy('full_name'); // works!

توجه کنید که نام این متود sortBy است و orderBy نیست.

همچنین متودsortByDesc()نیز وجود دارد.


$clients = Client::get()->sortByDesc('full_name');

در حقیقت sortBy متودی است که بر روی نتایج Eloquent که Collection هستند، کار می‌کند. شما می‌توانید راجع به تابعsortBy و سایر توابع Collectionها در اینجا بیشتر مطالعه کنید.

کامنت ها (0)

ارسال نظر