لاراول و متدهای firstOrNew، firstOrCreate، firstOr و updateOrCreate

دسته‌بندی نشده8 اردیبهشت 1399

اگه مدتی باشه که با لاراول کار میکنین، ممکنه با متدهای استانداردی مثل make()، create()، update()، و save() برای ایجاد مدل های Eloquent آشنا باشین. لاراول متدهای دیگه ای هم داره که واقعا میتونن در ایجاد و به روز رسانی مدل ها مفید واقع بشن و من حس میکنم در حقشون کم لطفی شده! بنابراین در قلاب امروز قراره تعدادی از این متدهای جذاب رو بهتون معرفی کنم و بگم در چه جاهایی میتونه به کارتون بیاد.

متد firstOrNew در لاراول

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

بدون استفاده از این متدی که گفتم احتمالا به صورت زیر عمل میکنین:

$user = User::where('email', request('email'))->first();

if ($user === null) {
    $user = new User(['email' => request('email')]);
}

$user->name = request('name');

$user->save()

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

$user = User::firstOrNew(['email' =>  request('email')]);

$user->name = request('name');

$user->save()

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

$user = User::firstOrNew(
    ['email' =>  request('email')],
    ['name' => request('name')]
);

$user->save();

متد firstOrCreate در لاراول

متد firsrOrCreate یکی دیگه از متدهای لاراول هستش که خیلی شبیه متد firstOrNew هست. متد firsrOrCreate سعی میکنه مدل هایی رو پیدا کنه که با attribute ای که به عنوان اولین پارامتر وارد کردین مشابه باشه. اگر مدل مورد نظر پیدا نشه، این متد بعد از اعمال attribute ای که به عنوان پارامتر دوم وارد شده، به صورت خودکار مدل جدیدی رو ایجاد و ذخیره میکنه. لطفا دقت کنین که اینجا دیگه نیازی به متد save() نیست. کافیه به شکل زیر عمل کنید:

$user = User::firstOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);

// No call to $user->save() needed

متد firstOr در لاراول

اینم یه متد جالب دیگه از لاراول که تازه کشفش کردم! firstOr اولین مدل از یک پرسجو (query) رو بازیابی میکنه، اگر چنین مدلی رو پیدا نکنه یک callback رو فراخوانی میکنه و پاس میده. این متد میتونه مثلا زمانی که نیاز دارین موقع ایجاد یه کاربر جدید چند تا مرحله کار دیگه هم انجام بدین مفید باشه. مشابه کد زیر باید عمل کنین:

update$user = User::where('email', request('email'))->firstOr(function () {
    $account = Account::create([ //... ]);

    return User::create([
        'account_id' => $account->id,
        'email' => request('email'), 
    ]);
});

متد updateOrCreate در لاراول

متد دیگه ای در لاراول داریم با نام updateOrCreate. این متد سعی میکنه مدلی رو پیدا کنه که دارای محدودیت هایی باشه که به عنوان اولین پارامتر در متد اعلام شده. اگر چنین مدلی رو پیدا کنه، با attribute ای که در پارامتر دوم متد اومده، اون مدل رو به روز رسانی میکنه. در صورتی که چنین مدلی رو پیدا نکنه، مدلی ایجاد میکنه که هردو پارامتر اول و دوم رو دارا باشه.

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

$user = User::where('email', request('email'))->first();

if ($user !== null) {
    $user->update(['name' => request('name')]);
} else {
    $user = User::create([
      'email' => request('email'),
      'name' => request('name'),
    ]);
}

// Do other things with the User

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

$user = User::updateOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);

// Do other things with the User

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

Please Post Your Comments & Reviews

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*