It is an age old question of having a parent model, whose properties can be 
"extendable". Something similar to Single-table-inheritance, but now really.

I don't know what the name for this pattern is, so please let me know if 
you do. I have first seen it in CakeDC's "UserDetails" 
model<https://github.com/CakeDC/users/blob/master/Model/UserDetail.php>in the 
Users 
plugin <https://github.com/CakeDC/users>, which implies it IS possible in 
Cake.

So here's an overly simplified example:

Car [model, make, year] hasMany Property [key, value, class]

Tire extends Property [allow_keys: diameter, width]
Engine extends Property [allow_keys: displacement, type]
Interior extends Property [allow_keys: seats, dash, aircon]

The background database rows for this example would be:

Car:
   [ model: beetle; make: volkswagen; year: 1956 ]
Properties:
[ key: Tire.diameter;       value: 15;       class: Tire ]
[ key: Tire.width;          value: 180;      class: Tire ]
[ key: Engine.displacement; value: 1200;     class: Engine ]
[ key: Engine.type;         value: petrol;   class: Engine ]
[ key: Interior.seats;      value: leather;  class: Interior ]
[ key: Interior.aircon;     value: false;    class: Interior ]

But you would save/retrieve it like this (helper methods):

array (
   'Car' => [model: beetle, make: volkswagen, year: 1956],
   'Tire' => [diameter: 15, width: 180],
   'Engine' => [displacement: 1200, type: petrol]
   ... your get the concept
)

Each model is responsible for its set of of fields (validation rules and 
key=>value typesetting), as well utilizing awesome callback functionality, 
etc.

The benefits:
- easily extendable data logic (just extend the model and define the fields 
you need)
- virtually unlimited and highly flexible properties
- speed (there is only one table join per Car request)
- easily cachable
- insta-setup (bind the association on-the-fly and you're ready to go)

Cons:
- not really a proper relational database design
- find conditions would be a bitch, but a different query approach might do 
the trick
- huge properties table
- Model was not really built for that... :)

Is there a solution for this (a behavior, anyone?). I've seen some some, 
which name themselves SingleTableInheritance or ClassTableInheritance, but 
this is not really STI.

If you feel the urge to go "no-no-no" on my ass, my requirement is to 
dynamically extend the properties with many different "property group" 
classes. If I resolve it through standard relations, I would have thousands 
of tables related to the basic model, holding just a few records each. 
There is also the issue of creating the tables dynamically.

I am in the middle of test-driving this model, so I thought it would be 
good to ask for the opinion of the experienced forum! :D Thoughts will be 
much appreciated.

Cheers!

-- 
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

--- 
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/cake-php?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to