If it was a relatively small set of alternatives that were clearly designated from the beginning and were unlikely to change, I wouldn't model it at all and I would use business logic. If there are a lot of options, this sounds more like a binary tree and you may want to "borrow" from the tree/ACL behaviors.
On Jun 30, 6:10 pm, Bart van Wissen <[EMAIL PROTECTED]> wrote: > I'm building an application which deals with "alternatives". I won't > go into the details of the application, but what's important here is > that these alternatives have relationships between them. These include > "enables", "excludes", "forbids", etc. For example, "alternative A > forbids alternative B" means that after choosing alternative A, > alternative B cannot be chosen. > > Now I was wondering what would be the best way to model this in > CakePHP (and MySQL). For a given alternative, I want to get all > related alternatives. The way I do it now is by using a table called > "alternative_relationships", which has two foreign keys, > "alternative_1" and "alternative_2", and a relationship name. > In my Alternative model, I put this: > > var $hasAndBelongsToMany = Array( > 'RelatedAlternative' => Array( > 'className' => 'Alternative', > 'joinTable' => 'alternative_relationships', > 'foreignKey' => 'alternative_1', > 'associationForeignKey' => 'alternative_2' > ) > ); > > This way, I only get the relationships that have this alternative at > the 'left' side of the relation. > So for example, if there is a relationship "A forbids B", then for > alternative A I would get alternative B as a related alternative, but > for alternative B, I won't get A. > > So I added the inverse version to get those too: > > var $hasAndBelongsToMany = Array( > 'RelatedAlternative' => Array( > 'className' => 'Alternative', > 'joinTable' => 'alternative_relationships', > 'foreignKey' => 'alternative_1', > 'associationForeignKey' => 'alternative_2' > ), > 'InverseRelatedAlternative' => Array( > 'className' => 'Alternative', > 'joinTable' => 'alternative_relationships', > 'foreignKey' => 'alternative_2', > 'associationForeignKey' => 'alternative_1' > ) > ); > > This way, I get all relationships which have this alternative on > either side of the relation (so either alternative_1 or > alternative_2). I can't help but feel that this is not a very pretty > solution though, because now they end up in separate arrays. > > It would be much nicer if I could get all related alternatives > together, and distinguish the 'direction' of the relationships by > using separate names for the inverse relations (like "forbids" and "is > forbidden by"). > An easy solution would be to insert additional records in the > relationships table for the inverse relationships, but I don't like > having redundant data in my database, because it's hard to manage and > easy to mess up. > > I would love to read your ideas about this. How would you store this > kind of information, and how would you model it in CakePHP? --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "CakePHP" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/cake-php?hl=en -~----------~----~----~----~------~----~------~--~---
