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

اگر با لاراول کار کرده باشید، به طور حتم با متدهای استاندارد برای ساخت مدل‌های Eloquent مثل make()، create()، update() و save() آشنایی دارید. لاراول متدهای دیگری هم دارد که آن طور که باید و شاید به آن‌ها توجه نشده است. این متدها برای آپدیت و ساخت مدل‌ها واقعا کارآمد هستند. در این مقاله از باورژن قصد داریم تعدادی از این متدها را با هم بررسی کنیم. با ما همراه باشید.

متد 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()

می‌توانید آرایه‌ای از اتریبیوت‌های اضافی را به عنوان پارامتر دوم قرار دهید تا در صورت عدم یافتن رکورد منطبق، در رکورد جدید اضافه شود:

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

$user->save();

متد firstOrCreate

متد firstOrCreate خیلی شبیه به متد firstOrNew است. سعی می کند رکوردی را مطابق با اتریبیوت مورد نظر شما پیدا کند. اگر رکورد را پیدا نکرد، به صورت اتوماتیک یک مدل جدید ایجاد و ذخیره می‌کند.

توجه

پس تفاوت متد firstOrCreate با متد firstOrNew در ذخیره کردن مدل است. در واقع در firstOrNew مانند ایجاد یک instance از مدل عمل می‌کند که نیاز به ذخیره شدن دارد ولی firstOrCreate نیازی به ذخیره شدن ندارد.

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

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

متد firstOr

متد firstOr اولین رکورد یک کوئری را باز می‌گرداند. اگر رکورد مورد نظر پیدا نشد، کال‌بکی که به آن پاس داده شده را فراخوانی می‌کند. این متد زمانی که مجبورید برای ایجاد یک کاربر، مراحل اضافی انجام دهید واقعا مفید است. یا حتی وقتی می‌خواهید کاری غیر از ایجاد یک کاربر جدید انجام دهید.

اصطلاح فنی

کال‌بَک یا callback به فانکشنی می‌گویند که نامی ندارد. کال‌بک اغلب یا به صورت یک پارامتر تعریف می‌شود.

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

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

متد updateOrCreate

و اما متد آخر. این متد شبیه به متد firstOrCreate است اما با یک تفاوت کوچک. اگر رکورد مورد نظر را پیدا کند، بلافاصله آن را آپدیت می‌کند. اگر وجود نداشت آن را با توجه به شروطی که به عنوان آرگومان اول و اتریبیوت‌هایی که به عنوان پارامتر دوم به این متد پاس دادیم می‌سازد.

توجه

تفاوت متد firstOrCreate با متد updateOrCreate در آپدیت کردن است. در واقع متد firstOrCreate در صورت یافتن رکورد، آن را ریترن می‌کند ولی متد 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 Us

با استفاده از متد updateOrCreate می‌توانید آن را ریفکتور کنید:

$user = User::updateOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
 
// Do other things with the User

به طور کلی، این متدها می‌توانند کمک کنند تا در شرایط خاص کد خود را بهبود بخشیده و گزینه‌های بیشتری برای کار با مدل‌ها در اختیار داشته باشید.

رقیه اباذری

رقیه اباذری

تو دانشگاه IT خوندم و اکثر منابع کتاب‌های ترجمه شده بودند و صدالبته مبهم :( مثلا element رو "عنصر" ترجمه می‌کردن و من همیشه می‌رفتم تو شیمی و جدول مندلیف. تو باورژن سعی کردم تا حد ممکن مطالب رو با زبان ساده و قابل درک بنویسم. باشد که کسانی که تازه پا به عرصه برنامه‌نویسی گذاشتن، راغب‌تر بشن و با نظرات و فیدبک‌های شما راه هموارتر بشه:)

دیدگاه‌ها


ثبت دیدگاه