حقه هایی برای استفاده از Eloquent در لاراول - سری دوم

نویسنده:  حسین شفیعی
تاریخ انتشار:  15 مرداد 1398
تاریخ آپدیت:  15 مرداد 1398
دسته بندی ها:  لاراول 

در ادامه ی سری اول از همین مقاله از شما دعوت می کنم تا ادامه ی این ترفند ها را با هم بیاموزیم، امیدوارم که مفید واقع شود.

ترفند های این دفعه شاید یکم پیچیده تر باشن اما بسیار کاربردی تر هستن.

8-Order by relationship

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

برای اینکار ابتدا باید یک رابطه جداگانه به این صورت به مدل تاپیک خود اضافه کنیم.

public function latestPost()
{
    return $this->hasOne(\App\Post::class)->latest();
}

و حالا برای گرفتن تاپیک ها بر اساس جدیدترین تاریخ ارسال پست برا یآن تاپیک در کنترلر خود این کد ها را مینویسیم:

$topics= Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');

9-Eloquent::when() - برای جلوگیری از شروط

خیلی وقت ها شرایطی به وجود می آید که مجبور می شویم کوئری های شرطی بزنیم مثل کد زیر:

if (request('filter_by') == 'likes') {
    $query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
    $query->orderBy('created_at', request('ordering_rule', 'desc'));
}

اما راه بهتر استفاده از روش زیر است:

$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
    return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});

روش دوم شاید خیلی باحال تر نباشه ولی قدرت استفاده از این روش در استفاده کردن از پاراکتر ها هست:

$query = User::query();
$query->when(request('role', false), function ($q, $role) { 
    return $q->where('role_id', $role);
});
$authors = $query->get();

10-BelongsTo Default Models

فرض کنید میخواهید نام نویسنده یک پست را نمایش بدهید در بلید شما این کار را میکنید:

 $post->author->name 

حالا اگر کاربری که این پست را نوشته حذف بشود شما خطا دریافت میکنید و احتمالا اینگونه جلوی خطا را میگیرید:

 $post->author->name ?? '' 

اما شما میتوانید این مشکل را در همان سطحی که رابطه خود را تعریف میکنید حل کنید:

public function author()
{
    return $this->belongsTo('App\Author')->withDefault();
}

در این رابطه اگر نویسنده مطلب حذف شده باشد مقدار null  برگردانده می شود اما میتوانیم یک مقدار پیشفرض برای نویسنده تنظیم کنیم تا در صورت حذف نویسنده مطلب آن اطلاعات پیشفرض برگشت داده شوند:

public function author()
{
    return $this->belongsTo('App\Author')->withDefault([
        'name' => 'Guest Author'
    ]);
}

11-Order by Mutator

فرض کنید شما میخواهید نام کامل یک کاربر را بر گردانید :

  return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];

حالا فرض کنید میخواهید کاربران را بر اساس نام کامل مرتب سازی کنید:

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

اما کد بالا کار نخواهد کرد.

را حل این است که بعد از دریافت اطلاعات آن ها را مرتب سازی کنید:

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

اما به کد های نوشته شده دقت کنید اینبار مرتب سازی را با متد sortBy  انجام دادیم نه orderBy.

12-Default ordering in global scope

چه کنیم اگر بخواهیم همیشه رکورد هایی که برای ما برگشت داده می شوند بر اساس نام کاربر مرتب سازی شده باشند؟ جواب ساده است استفاده از Global Scope  ها :

protected static function boot()
{
    parent::boot();

    // Order by name ASC
    static::addGlobalScope('order', function (Builder $builder) {
        $builder->orderBy('name', 'asc');
    });
}

آموزش مفصل Scope  ها در همین سایت از طریق این لینک موجود است.

13-Raw query methods

گاهی اوقات نیاز داریم تا کوئری های خود را به صورت خام در الکوئنت بنویسیم خوشبختانه برای اینکار متد هایی وجود دارد:

// whereRaw
$orders = DB::table('orders')
    ->whereRaw('price > IF(state = "TX", ?, 100)', [200])
    ->get();

// havingRaw
Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();

// orderByRaw
User::where('created_at', '>', '2016-01-01')
  ->orderByRaw('(updated_at - created_at) desc')
  ->get();

14-Replicate: make a copy of a row(کپی از یک رکورد از جدول)

گاهی اوقات نیاز داریم تا یک سطر را کپی کنیم:

$task = Tasks::find(1);
$newTask = $task->replicate();
$newTask->save();

ادامه دارد ... 

قسمت اول

#Eloquent  
     600

دوره های آموزشی

با کیفیت ترین دور های آموزشی برنامه نویسی PHP و JavaScript

مقاله های بروز

دنبال کردن دنیای تکنولوژی و اخبار زبان ها و فریمورک های جدید برنامه نویسی

نقشه راه

نقشه ای برای تبدیل شدن به یک برنامه نویس حرفه ای

رفع اشکالات برنامه نویسی

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

مقالات پیشنهادی

ابتدایی
دسته بندی ها : جاوا اسکریپت

بررسی ابتدایی 10 فریمورک برتر جاوا اسکریپت در سال 2019

در این مقاله قصد داریم تا بهترین فریمورک های جاوا اسکریپت مانند ریکت و ویو جی اس و ... که در سال 20...

متوسط
دسته بندی ها : لاراول

برخی از ویژگی های مهمی که لاراول را محبوب کرده است

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

متوسط
دسته بندی ها : لاراول

دلایل پیدایش فریمورک محبوب لاراول و بررسی نسخه های مختلف آن

در این مقاله به بررسی نسخه های مختلف لاراول و ویژگی هایی که در هر نسخه به این فریمورک اضافه شده است...

متوسط
دسته بندی ها : پکیج های لاراول PHP

یه پکیج کامل برای کار با تاریخ شمسی در php و لاراول (morilog/jalali)

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

ابتدایی

نکات مهمی که باید در مسیر تبدیل شدن به یک برنامه نویس حرفه ای به آن ها توجه کنید

شما می‌توانید برنامه‌نویسی را بیاموزد و وارد این حرفه شوید، اما پیمودن این مسیر فوت و فن هایی دارد...

متوسط
دسته بندی ها : لاراول PHP

حقه هایی برای استفاده از Eloquent در لاراول - سری اول

در این مقاله حقه ها و ترفند هایی از Eloquent را به شما می گوییم که کمتر به آنها پرداخته شده است، ا...

دیدگاه های کاربران

ثبت دیدگاه جدید

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

برای استایل دادن به نوشته های خود میتوانید از Mark-down استفاده کنید.

مطالعه قوانین mark-down

پیشنمایش دیدگاه شما

هیچ دیدگاهی برای این موضوع ثبت نشده است.

اولین کسی باشید که برای این موضوع دیدگاهی مینویسد.