mgsmus yazdıKabaca
products_options diye bir tablonuz olsun:
id, product_id, option, value
Products modelinin created olayında $product->attributes ile products tablosundaki alanları karşılaştırıp, products tablosunda olmayan alanları products_options tablosuna yazdırın:
products_options:
1, 1, "color", "red"
2, 1, "dimensions", "100mmx12mmx125mm"
fikri şöyle geliştirebiliriz.
modelAttributes:
|---hashId--|----name----|----type---|--value--|
f3b61048.. | "color", | "string" | 'red' |
f3b61048.. | "color", | "string" | 'blue' |
f3b61048.. | "capacity", |"float" | '12.99' |
f3b61048.. | "quantity", |"integer" | '365' |
f3b61048.. | "quantity", |"array" | '{...}' | //json serialize
Her model için özelliklerini dinamikleştirmek istersek şuna benzer bir tablo yaratılabilir. HashID kısmanına model sınıf ismi ve id'sini karıştırarak bir hashlenmiş benzersiz id yaratılır. Sonrasında da bir modeli sarmalayan bir sınıf yazılabilir. Sıfın kurucusunda herhangi bir model enjekte eder. Sarmalayıcı nesnesi modelde olmayan özellikleri bu tabladan bulmaya çalışır..
Kullanımı şuna benzer bir şey olur
$özellikler = [...] // modele ait özellikler
$dinamikÖzellikler = [...] // dinamik özellikler
$tümÖzellikler= array_merge($özellikler, $dinamik_özellikler);
$product = new Sarmalayıcı($tümÖzellikler); // burada hem model yaratılır, hem de modele ait sarmalayıcı yaratılır.. dönen nesne sarmalyıcıdır. İçinde gerçek product modeli vardır..
$product->save();
$product->dimaikBirÖzellik = 12323; // sarmalayıcı bunun modele ait olmadığını fark eder. veri türünü saptayıp 'modelAttributes' tablosuna yazar..
$product->modeleAitbirÖzellik = 'misal' ; // normal model CRUD işlemeri sarmalayıcı uygulular..
Avantajı tek bir tablo ile tüm modelleri dinamik özellikler eklenebilir. Kullanımı daha kolay, kullanım mantığı basit..
Kabaca bu mantıklar olur sanırım. Bu fikri biraz daha geliştirip bir eklenti yazacam...