nuri60 Benim yazdığım yöntemin avantajları:
Çok-boyutlu diziler tutulabilir, okunabilir, casting kullanıldığı için array <-> json dönüşümü otomatik gerçekleşir:
$model->data = [
'attributes' => [
'colors' => [
'BLK' => 'Black',
'RED' => 'Red'.
'YEL' => 'Yellow'
],
'sizes' => ['S', 'M', 'L', 'XL']
]
];
$model->save();
AsArrayObject::class kullanılarak mevcut veride, veriyi çekmeden kısmi değişiklik yapılabilir:
protected $casts = [
'data' => AsArrayObject::class,
];
$model->data['attributes']['colors']['BLU'] = 'Blue';
$model->save();
Veritabanı düzeyinde JSON işlemleri yapılabilir:
$results = Model::whereJsonContains('data->attributes->sizes', ['S', 'M'])
->get();
Veritabanında bu alanlara index oluşturularak performanslı sorgulamalar yapılabilir:
PostgreSQL:
$table->rawIndex("USING GIN((data->'attributes'))", 'data_attr_index');
MySQL:
$table->string('virtual_attributes')
->virtualAs('data->>"$.attributes"')
->index('data_attr_index');