← العودة إلى المدونة

من المدونة

التعامل مع حقول JSON باستخدام Eloquent Casts في Laravel

استخدم AsArrayObject لتعديل بيانات JSON، وAsCollection عندما تحتاج إلى أدوات Collections داخل الموديل.

Flat illustration of JSON arrays becoming structured collection cards

تفيد أعمدة JSON عندما يحتوي السجل على بيانات مرنة، مثل مواصفات المنتج أو قائمة نسخه المختلفة. يستطيع Laravel تحويل قيمة العمود تلقائيًا عند قراءة الموديل، فلا تحتاج إلى استخدام json_decode في كل مرة.

اختيار نوع التحويل المناسب

يناسب تحويل array قراءة قيمة JSON كاملة أو استبدالها. إذا أردت تعديل عنصر داخلها ثم حفظ الموديل، فاستخدم AsArrayObject لتفادي مشكلة تعديل عناصر المصفوفة مباشرة. أما AsCollection فيوفر أدوات Laravel Collections مثل push وwhere.

use Illuminate\Database\Eloquent\Casts\AsArrayObject;
use Illuminate\Database\Eloquent\Casts\AsCollection;

class Product extends Model
{
    protected $casts = [
        'specs' => AsArrayObject::class,
        'variants' => AsCollection::class,
    ];
}

أنشئ العمودين specs وvariants بنوع JSON في Migration. الـcast يغير طريقة التعامل مع القيمة في Eloquent، بينما تظل محفوظة في قاعدة البيانات بصيغة JSON.

تعديل البيانات

$product = Product::findOrFail($id);
$product->specs['ram'] = '32 GB';
$product->variants->push(['color' => 'Blue', 'price' => 1099]);
$product->save();

إذا كان الحقل قد يكون فارغًا، هيئه قبل استدعاء دوال Collection، وتحقق من بنية البيانات القادمة من المستخدم. أما البيانات التي تعتمد عليها باستمرار في البحث والربط بين الجداول، فقد تكون الأعمدة أو الجداول العادية أنسب لها. راجع توثيق Laravel للـcasts للتفاصيل.

المصدر: مقال Abdo Host الأصلي على Medium.