[Dbix-class] PATCH: Support for arbitrary SQL in relationship
definition
David Ihnen
davidi at norchemlab.com
Tue Jun 30 16:10:45 GMT 2009
Rob Kinyon wrote:
> Now, if someone can provide a solid use-case, then I'll be onboard.
> But, adding features for the sake of adding features is how you end up
> with a crappy API.
>
> Rob
Lets see if I can argue the use case. I tripped over this limitation
and I *think* it was when I was doing this part of the implementation
I have a data structure formed like so;
Each client has a set of users. Clients are enumerated in a separate
table, foreign keyed from the user table. They use the same structure
for their hierarchy.
Each user record thus has a client value, as well as a left and a right
value. The data structure is maintained so that the left and right
numbers are sequential - supervisor has left/right of 1/4, his single
subordinate has left/right of 2/3 - on insert of another subordinate,
supervisor becomes 1/6 and the second subordinate is 4/5. A
sub-subordinate on the second user would be 5/6, moving his super to 4/7
and the top super to 1/8.
This allows an arbitrary depth of organizational structure but allows
straightforward queries for inheritance/supervisor permission checks.
If the client is the same and their left and/or right are between your
own, they are your subordinate.
If the client is the same and you are between somebody else's left and
right, they are your supervisor.
The complication comes when I want to describe the relationships 'users
subordinates' or 'users supervisors'. The constraint of 'in the same
client' is part of the join term - not just a where clause.
So I'd like to say something like this in my user model class:
package DB:Schema::samp_user;
__PACKAGE__->has_many('subordinates' => 'DB::Schema::samp_user', {
'subordinates.client' => 'samp_user.client', 'subordinates.lft' => {
'-between' => [ 'samp_user.lft', 'samp_user.right' ] } } );
But I can't, because you can't specify complicated join conditions like
that.
So what do you think, is that a solid use case?
David
More information about the DBIx-Class
mailing list