محمدتقی نقیبی
محمدتقی نقیبی
خواندن ۳ دقیقه·۲ سال پیش

ستون های تولید شده و نحوه ی استفاده از آنها در لاراول

ستون های تولید شده یا Generated Columns که در نسخه ی ۵.۷ برای MySQL در نسخه ی ۱۲ برای PostgreSQL و در نسخه ی 3.31.0 برای SQLite معرفی شد. آنها را می توان در خلال دستورات create یا alter جداول ایجاد کرد و روشی است برای ذخیره ی داده بدون ارسال آنها در زمان اجرای دستورات insert یا update در واقع ستون های تولید شده ستون های خاصی هستند که همیشه مقدار آنها از ستون های دیگر به دست می آید و پایگاه داده خود مسول مقداردهی آنهاست.

دو نوع Generated Columns داریم Virtual و Stored که از عبارات مثل زیر می توان برای آنها استفاده کرد:

  • عبارات ریاضی مثل product_price * quantity
  • توابع داخلی مثل ()RIGHT(), CONCAT(), FROM_UNIXTIME(), JSON_EXTRACT
  • لیترال ها مثل 0 , "new" , "2"

مثال

یک فروشگاه مجازی با جداولی به شکل زیر در نظر بگیرید لینک اسکیما:

  • جدول users که مسئول نگهداری اطلاعات کاربران است.
  • جدول products که مسئول نگهداری اطلاعات محصول مثل قیمت و توضیحات است.
  • جدول orders که شناسه ی کاربر و تاریخ سفارش را نگه می دارد.
  • جدول order_items که شناسه ی محصول - شناسه ی سفارش - تعداد - قیمت و زمان خرید را نگه می دارد.

به تعریف جدول order_items توجه کنید:

  • برای گرفتن قیمت مجموع یک سفارش یعنی total_item_price که با مقدار product_price * quantity برابر است روش های مختلفی وجود دارد:
  • می توان این مقدار را محاسبه و در یک ستون ذخیره نمود.
  • می توان از یک view برای این کار استفاده کرد.
  • یا در سطح برنامه هر بار آنرا محاسبه نمود.

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

نوع اول Virtual Columns

مزایا:

  • هیچ فضایی مصرف نمی کنند مگر اینکه آنها را ایندکس کنید
  • یک عمل INPLACE به حساب می آید بدین معنی که با تغییر جدول نیازی به کپی مجدد تمامی داده ها نیست (اطلاعات بیشتر).
  • مقدار آن در زمان واکشی به اصطلاح on the fly محاسبه می شود.

برای داده ای مناسب است که تغییرات آن قابل توجه باشد. هزینه ی virtual columns خود را در زمان واکشی نشان می دهد زیرا که هر دفعه ماشین درگیر محاسبه ی مقدار می شود.

نوع Stored Columns

  • فضای دیسک را اشغال می کنند.
  • همان هزینه ی کپی که اضافه کردن یک ستون جدید دارد را متحمل می کند.
  • مقدار آن در دستورات INSERT و UPDATE به روزرسانی می شود.

برای داده ای مناسب است که تغییرات آن زیاد نباشد مثل total_item_price در مثال بالا زیرا زمانی که رکورد ایجاد شد مقدار price و quantity تغییر نمی کنند.

کد

به خطوط 9 و 23 توجه کنید هر دو نوع ستون های تولید شده با استفاده از کلمه ی AS تعریف می شوند ولی اگه بخواهیم از نوع stored باشد باید بعد از عبارت بیان شود.

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

استفاده از ستون های تولید شده در لاراول

به راحتی با استفاده از متد های زیر می توانید هر دو نوع Generated Column را در مایگریشن های خود تعریف کنید:

$table->decimal('total_item_price',10,2)->storedAs('quantity * product_price'); $table->decimal('total_item_price',10,2)->virtualAs('quantity * product_price');


پیروز باشید...

منبع اصلی




ستون‌های تولیدlaravelgenerated columnsلاراول
بدون تلاش هیچی به دست نمیاد و همیشه خاطرم میمونه برای بدست آوردن چیزی که نیاز به زمان داره باید صبر کنم.
شاید از این پست‌ها خوشتان بیاید