لارافيل, Model / 2024-07-18

ما هو Casting وكيف يتم إستخدامة في لارافيل

ما هو Casting وكيف يتم إستخدامة في لارافيل

2024-07-18 وقت القراءه : 2 دقائق

في مقالة سابقة تحدثنا عن أهمية Accessories & Mutators في لارافيل ، حيث تتيح لنا التعديل على البيانات قبل إدخالها إلى قاعدة البيانات، أو عند جلبها من قاعدة البيانات لعرضها بالتطبيق، في هذه المقالة سوف يتم التطرق لمفهوم جديد وهو casting values، وهي بإختصار تحويل نوع الحقل، مثلا لدي نوع enum أريد أن أحولة إلى boolean  وهكذا .


لفرض أن لدينا جدول  Products وبه حقل is_available والذي يعني أن المنتج متاح أم لا، حيث إذا كانت القيمة 1 تعني أن المنتج متاح، أما إذا كانت 0 تعني أن المنتج غير متاح للشراء، ومن الطبيعي في هذه الحالة أن يكون منطق العمل الخاص بنا كالتالي:

if($product->is_available === 1)
  {
    // ...
  }


لكن لجعل الكود الخاص بنا أسهل وأكثر إحترافية، تتيح لنا لارافيل عمل cast للـ attribute بداخل model، لكن كيف؟

للقيام بعمل cast في داخل الموديل، كل ما علينا القيام به هو تعريف دالة $casts ، وتعريف النوع الجديد لهذا attribute

class Product extends Model
{
    use HasFactory;
    protected $casts = [
        'is_available' => 'boolean',
    ];
}

منذ هذه اللحظة ( بعد تعريف casts )، كلما تم مناداة is_available بشكل فإنه بشكل تلقائي يتم تحويلها إلى نوع Boolean بحيث إذا كانت القيمة في قاعدة البيانات = 1 تعيد True، وإذا كانت = 0 تعيد false.

@foreach($products as $product)
    @if($product->is_available)
        <h2>{{ $product->name }}</h2>
    @endif
@endforeach


أنواع Casts المسموح بها

تدعم الأنواع التالية integer, real, float, double, string, boolean, object, array.


Array & JSON Casting

array cast عادتاً يستخدم عندما نتعامل مع حقل يتم تخزين البيانات به على شكل مصفوفة.

لفرض أنني في جدول Products يوجد لدي حقل cats وهو من نوع JSON حيث أقوم بتخزين أقسام المنتج ["Jackets","Clothes","Cotton"] لكن أريد أن يتم عرضها على شكل مصفوفة

في الموديل يجب عمل cast لحقل cats

protected $casts = [
    'is_available' => 'boolean',
    'cats'=>'array'
];

بعد تعريف cast، فإنه بشكل تلقائي تتحول إلى مصفوفة PHP، ويمكن تعديل أي قيمة داخل المصفوفة 

$product=Product::findOrFail(1);
$options = $product->cats;
$options[1]='value';
$product->cats=$options;
$product->save();


Array Object & Collection Casting

على الرغم من روعة array cast إلا أنها في بعض الأحيان لا تعتبر مفيده، لأن نوع array يكون primitive ( أساسية )، على سبيل المثال لو أردنا تعديل قيمة معينة بداخل حقل cats وهو من نوع JSON بالشكل التالي

$product = Product::find(1);
$product->options['key'] = $value;

فإنه سوف يرجع خطئ، ولحل هذه المشكلة وفرت لارافيل نوع جديد من cast بإسمAsArrayObjectK ولإستخدامه 

protected $casts = [
   'cats'=>AsArrayObject::class,
];
$product=Product::findOrFail(1);
$product->cats[0]='cotton';
$product->save();

وبشكل مشابة لـ AsArrayObjec وفرت لارافيل إمكانية عمل cast كـ collection من خلال AsCollection cast حيث تسمح بعمل cast لـ JSON إلى laravel Collection instance.

protected $casts = [
    'cats'=>AsCollection::class,
];

 

للمزيد حول إستخدام  attribute cating يمكنك قراءة المزيد من الموقع الرسمي من هنا.


التعليقات
زائر
منذ 3 سنوات

الله ينور

زائر
منذ 3 سنوات

محتوى رائع وفقك الله

إضافة تعليق
Loading...