كيف تخزن الأسعار في قاعدة البيانات في لارافيل بطريقة أسرع ؟
نستطيع تخزين الأسعار بطريقة أفضل من حيث السرعة والمساحة المستخدمة في لارافيل إلوكوينت من خلال تجنب حفظ الأرقام العشرية في قاعدة البيانات. الفكرة بإختصار هي أننا نحفظ السعر كـ عدد طبيعي وليس رقم عشري.
كيف نخزن الأسعار كـ integers ؟ 🔗
- نضيف عمود إلى قاعدة البيانات من النوع integer ونجعله مخصصاً لتخزين السعر price بأقل وحدة من وحدات العملة التي نستخدمها. على سبيل المثال؛ الجنية المصري، نخزن السعر بالقرش وليس بالجنية، علماً بأن الجنية الواحد يساوي ١٠٠ قرش. لذلك إن كان السعر هو 99.99 جنية سيتم تخزين السعر كـ 9999 قرش.
- نستخدم mutator في لارافيل إلوكوينت لتحويل السعر إلى integer قبل تخزينه في قاعدة البيانات. يتم تحويل السعر إلى integer عن طريق تحويله من جنية إلى قرش من خلال الضرب في ١٠٠ وهي معامل التحويل من جنية لـ قرش ، كما سترى في الكود بعد قليل.
- نستخدم accessor في المودل لتحويل السعر لقيمته الأصلية (بالجنية المصري في هذه الحالة). كل ما نفعله هو أننا نقسم على معامل التحويل وهو ١٠٠ في هذه الحالة. ونظهر السعر بالجنية وبعلامة عشرية كما كان قبل حفظه في قاعدة البيانات.
فوائد ومزايا حفظ الأسعار كرقم طبيعي بدون علامة عشرية 🔗
- أقل من استهلاك مساحة التخزين: الأرقام الـ integer تستخدم مساحة تخزين أقل من الأرقام العشرية decimals.
- الدِقة: تجنب أخطاء تقريب الأعداد التي تحدث أحياناً في الأرقام العشرية في ذاكرة الكمبيوتر.
- السرعة والأداء: العمليات الحسابية بالأرقام الـ integers تتم أسرع.
خطوات تنفيذ تخزين الأسعار كأرقام integers في لارافيل 🔗
في المودل model ، أضف عمود بإسم price وأضفه إلى الـ $fillable
لكي يُمكن إضافته وتعديله.
class Product extends Model
{
protected $fillable = ['price'];
}
أضف mutator لتحويل الأرقام العشرية إلى أرقام integer قبل حفظها في قاعدة البيانات.
class Product extends Model
{
// store 'int' instead of 'double' in db for performance
public function setPriceAttribute($value)
{
// 99.99 EGP (UI) -> 9999 pt (db)
$this->attributes['price'] = $value * 100;
}
}
أضف accessor لتحويل الأعداد الـ integer إلى أرقام عشرية decimal قبل استخدامها في واجهة المستخدم.
class Product extends Model
{
public function getPriceAttribute()
{
// 9999 pt (db) -> 99.99 EGP (UI)
return number_format($this->attributes["price"] / 100, 2);
}
}
لكن إن كنت ستستخدم السعر في عمليات حسابية، استخدم هذا الكود بدلاً من السابق.
class Product extends Model
{
public function getPriceAttribute()
{
// 9999 pt (db) -> 99.99 EGP (UI)
return floatval(number_format($this->attributes["price"] / 100, 2));
}
}
لأن الفانكشن floatval()
تحول قيمة السعر إلى رقم ذو علامة عشرية. وبذلك تستطيع استخدامه في العمليات الحسابية دون الحاجة إلى تحويلات لأنه محول بالفعل.
أتمنى أن تكون قد استفدت من الموضوع ، إن كنت تعرف أي شخص يُمكنه الإستفادة من هذه المعلومات، ارسل له رابط هذا المقال. إن أردت معرفة الموضوعات الجديدة بعد نشرها مباشرةً على موقع أبانوب حنا ، تابعني على يوتيوب و تيليجرام ، و فيسبوك ، و واتساب .