ترفند های لاراول Eloquent قسمت دوم

حمید تیموری 1528 بازدید 1397/08/01
ترفند های لاراول Eloquent قسمت دوم


در مطلب قبلی برخی از ترفندهای Eloquent را توضیح دادم، 
برای دیدن دیگر ترفند ها مطلب زیر را بخوانید.

1. مرتب سازی بر اساس mutator ها
زمانی که شما از mutator ها استفاده میکنید، نمیتوانید هنگام query از orderBy استفاده کنید، چون ممکن است فیلدی که برای آن mutator نوشته اید، در جدول وجود نداشته باشد.
به عنوان مثال در جدول یک فیلد "نام" و یک فیلد "نام خانوادگی" وجود دارد، حالا میخواهیم، "نام کامل" را نمایش دهیم و query را بر اساس full_name مرتب کنیم ولی فیلد full_name در جدول ما وجود ندارد،
با کد زیر برای "نام کامل" یک mutator تعریف میکنیم:

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

حالا اگر بخواهیم بر اساس full_name مرتب کنیم، کد زیر اجرا نخواهد شد:

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

راه حل ساده است، ما باید عملیات مرتب سازی را بعد از گرفتن اطلاعات انجام دهیم:

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

دقت کنید برای این شکل از مرتب سازی باید از sortBy استفاده کنید، نه از orderBy !

2. مرتب سازی های پیشفرض با استفاده از global scopes
برای مثال اگر بخواهید مرتب سازی به صورت پیشفرض همیشه روی فیلد "نام" انجام شود، میتوانید از تابع boot که در مطلب قبلی توضیح داده شد استفاده کنید:

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

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

با توجه به توضیحاتی که درباره تابع boot داده شده است، قبل از اجرای query این scpope اجرا میشود!

3. توابع query های خام
بعضی مواق ممکن است شما نیاز داشته باشید که یک query خام به eloquent statement اضافه کنید. با توابع زیر میتوانید این کار را انجام دهید:

// 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();

4. کپی یک سطر توسط Replicate
با این تابغ میتوانید یک سطر از حدول را کپی کنید:

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

5. تابع chunk برای جدول های بزرگ
این مورد خیلی مرتبط با Eloquent نیست، و بیشتر مربوط به laravel collection است ولی به هرحال تابع قدرتمندی است که شما میتوانید روی جداول بزرگ از آن استفاده کنید.
به جای:

$users = User::all();
foreach ($users as $user) {
    // ...

از این کد استفاده کنید:

User::chunk(100, function ($users) {
    foreach ($users as $user) {
        // ...
    }
});

6. هنگام ساختن یک مدل چیزهای اضافه تری ایجاد کنید
همگی با دستور ساختن مدل آشنایی داریم

php artisan make:model Company

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

php artisan make:model Company -mcr

کاراکتر m برای ساختن migration 
کاراکتر c برای ساختن controller
کاراکتر r نشان میدهد که کنترلر باید resourceful باشد و توابع crud به صورت پیشفرض در کنترلر نوشته شود

7. override کردن update_at زمان ذخیره کردن
آیا میدانستید که تابع save میتواند پارامتر قبول کند؟ مثلا ما میتوانیم، updated_at را به صورت دستی تغییر دهیم و زمان ذخیره کردن این عمل را از طریق save به eloqeunt بفهمانیم:

$product = Product::find($id);
$product->updated_at = '2019-01-01 10:00:00';
$product->save(['timestamps' => false]);

در این مثال ما updated_at را ignore کردیم و به صورت دستی مقداردهی کردیم.

 

8. نتیجه تابع update چیست ؟

$result = $products->whereNull('category_id')->update(['category_id' => 2]);

تابع update زمانی که صدا زده میشود، رکورد در دیتابیس ویرایش میشود و رکوردی که برمیگرداند، رکورد ویرایش شده است !

9. تبدیل پرانتزها در کوئری های Eloquent
اگر شما شرط های ترکیبی یا and داشتید مثل زیر:

... WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)

چطور باید این کوئری را به Eloquent تبدیل میکردید ؟ راه زیر اشتباه است:

$q->where('gender', 'Male');
$q->orWhere('age', '>=', 18);
$q->where('gender', 'Female');
$q->orWhere('age', '>=', 65);

خروجی بالا اشتباه است، و شما باید برای پاسخ درست از sub-query ها استفاده کنید:

$q->where(function ($query) {
    $query->where('gender', 'Male')
        ->where('age', '>=', 18);
})->orWhere(function($query) {
    $query->where('gender', 'Female')
        ->where('age', '>=', 65); 
})


10. تابع orWhere با چندین پارامتر

شما میتوانید به orWhere چند پارامتر پاس دهید، روش زیر یک روش معمول است:

$q->where('a', 1);
$q->orWhere('b', 2);
$q->orWhere('c', 3);

اما بهتر است به شکل زیر استفاده کنید:

$q->where('a', 1);
$q->orWhere(['b' => 2, 'c' => 3]);



لاراول eloquent ویژگی های زیادی دارد که باید آنها را پیدا کنیم!
امیدوارم این مطلب برای شما مفید باشد.

دیگر مقالات
حمید تیموری 540 بازدید 1398/06/03
امید کیانی 1040 بازدید 1398/07/17
حمید تیموری 2379 بازدید 1397/05/09
امید کیانی 932 بازدید 1398/06/11
حمید تیموری 1866 بازدید 1398/03/02


نظرات (2)
Eskafild Xxx
1397/08/11 - 22:24
مقالات کاربردی و مفید .ممنون
حمید تیموری
1398/05/29 - 21:17
نظر لطف شماست
برای ثبت نظر ابتدا وارد سایت شوید