Return a hasMany relationship for a child object

Posted 6 days ago by LeonardChallis

I have two types of object: Level and Game. Every Level can have exactly one parent Level (or none, if it's the first level). But Levels can have multiple children. This creates a sort of hierarchy/family tree type structure that can change as new Levels are added. This is achieved on Level with a parent() (belongsTo relationship) method and a children() (hasMany() relationship) method.

Game objects specify a specific path of Levels, from first parent (where its parent is null) right down to a specific sub-Level, however far down the hierarchy. The way I have set this up is by giving Game a finalLevel() (belongsTo() relationship) method, pointing at said specific sub-Level. The idea then would be to recurse up until there are no more parents, when a whole Game had to be loaded. On the Level side, there is currently a games() (hasMany() relationship) method. However, this only returns the Game when the Level in question is the final one.

I've hit the point now where I want to figure out what Games any given Level belongs to, but anywhere in the hierarchy, not just the final Level. Is there a way I can alter the games() method so that it can recurse through a Levels children to see if it can find any more Games and return that Level's hasMany() relationship instead?

Or, is there a better pattern I should use for this?

I'm happy to do a bit of restructuring for the sake of cleaner code. I did consider adding a many-to-many relationship where Levels would have a relationship to both their parent and the Game, then somehow figure out the ordering of Levels when loading them from the Game object, but I'm not sure if that would be overkill?

Any advice would be greatly received, thanks!

Please sign in or create an account to participate in this conversation.