ترفندهای کدنویسی سریعتر با ORM لاراول

اُ.آر.اِم ( Eloquent ORM) یک ابزار ساده و قدرتمد و به قول خود لاراول زیبا برای کار با دیتابیسها از طریق این فریمورک هستش. توی این آموزش که گلچینی از این مقاله عالی هستش سعی کردم چندتا از ترفندهای ساده و مفید رو براتون انتخاب کنم و آموزش بدم.

کاهش و افزایش سریع مقدار یک فیلد

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

$article = Article::find($article_id);
$article->read_count++;
$article->save();

و راه حل اصولی و سریع:

$article = Article::find($article_id);
$article->increment('read_count');

مثالهای بیشتر:

Article::find($article_id)->increment('read_count');
Article::find($article_id)->increment('read_count', 10); // +10
Product::find($produce_id)->decrement('stock'); // -1

موقعیتهای اگر X پس Y!

موقعیتهای اگر x پس y تقریبا جز جدایی ناپذیر برنامه نویسیه. فرض کنید که باید چک کنید اگر یوزری با فلان مشخصات توی جدول کاربرها وجود نداره یه سطر اطلاعاتی بصورت اتوماتیک در نظر بگیرید براش و اصطلاحا رجیسترش کنید و یا یه ارور برگردونید (و یا نمایش بدیم). توی این حالت کدها معمولا این شکلیه:

مثال اول نمایش پیغام ارور:

$user = User::find($id);
if (!$user) { abort (404); }

کد سریعتر و بهتر؟

$user = User::findOrFail($id);

مثال دو: ثبت اطلاعات کاربر در صورت موجود نبودن مشخصات

$user = User::where('email', $email)->first();
if (!$user) {
  User::create([
    'email' => $email
  ]);
}

کد سریعتر و بهتر؟

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

پیدا کردن چند ردیف اطلاعاتی بصورت همزمان

دنبال کاربری با آیدی 1 میگردید؟ کد به این شکله:

$user = User::find(1);

دنبال چندتا یوزر میگردید با آیدیهای 1و2و3و4 ؟!

$users = User::find([1,2,3,4]); 
  • کد بالا معادل استفاده از WHERE IN در دستورات SQL هستش.

شرطهایی با یک فیلد:

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

$users = User::where('approved', 1)->get();

کد سریعتر و بهتر؟

$users = User::whereApproved(1)->get(); 

کافیه بعداز واژه where و بدون هیچ فاصله ای اسم فیلدتون رو اضافه کنید!

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

User::whereDate('created_at', date('Y-m-d')); // تاریخ کامل روز جاری
User::whereDay('created_at', date('d')); // روز جاری
User::whereMonth('created_at', date('m')); // ماه جاری
User::whereYear('created_at', date('Y')); // سال جاری


استفاده از orWhere و پارامترهای چندتایی:

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

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

کد سریعتر و بهتر؟

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


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

شاد باشید