في مقالة سابقة تحدثنا عن أهمية 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
تدعم الأنواع التالية integer, real, float, double, string, boolean, object, array.
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 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 يمكنك قراءة المزيد من الموقع الرسمي من هنا.
محتوى رائع وفقك الله
زائر
الله ينور