On Thu, 26 Apr 2007, Tobias Kremer wrote:

Yeah, but that's exactly what I want to avoid. If somebody does
$user->confirmed_friendships, he/she is not supposed to know who
initiated the friendship (requestor or receiver). All he/she wants
is a list of User objects (except $user) which are friends of $user.
The same goes for the other two methods. Currently I can't see a
sane way to accomplish this with DBIx::Class :(

Follow the advice from the other thread (make a view that unions the
table with itself, if possible use insert/update triggers to re-order
the two generic user columns in a consistent manner (and if doing
that, then add a third field for who initiated it)), and then add that
view to your schema with a relationship to user so that you can query
it.

I just checked this out with 100.000 user/friendship entries and the
view is slow as hell :( Although this is in fact the cleanest solution
I've seen up until now it's also the slowest.

The main problem is: I have to make a somewhat complex union query on the
friendship-table which should then automagically resolve the resulting
user_ids into User objects. Maybe there's some DBIx::Class magic that
allows me to run a custom query on another Class (UserFriendship, with
$self->id() as a where condition) and returning objects of the current
class (User).



I've not quite understood most of this thread, but it sounds like what you want is:

Table with user1_id, user2_id,

query that returns all user2_id matching a given user_id AND returns all user1_id that match when user2_is the given user_id.. correct?

I have this with DBIC, no unions involved ;)

My table is Relationships, with LItemID and RItemID, the rel is:

on Item: (an OR condition)
__PACKAGE__->has_many('rel_link', 'DB::Anything::Relationships',
                              [ { 'foreign.LItemID' => 'self.ID' },
                                { 'foreign.RItemID' => 'self.ID'} ]);

on Relationships: (an OR condition)
__PACKAGE__->has_many('attached_items', 'DB::Anything::Items',
                              [ { 'foreign.ID' => 'self.LItemID' },
                                { 'foreign.ID' => 'self.RItemID' } ],
                              {cascade_delete => 0});

in Item.pm:

sub connected_items
{
    my ($self) = @_;
    ## All items that arent this one:
    my $others = $self->rel_link->search_related('attached_items',
                {
                 'attached_items.ID' => { '!=', $self->id }
                },
                { 'order_by' => 'attached_items.Name' }
    );

    return $others;
}


Jess


_______________________________________________
List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
Wiki: http://dbix-class.shadowcatsystems.co.uk/
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
Searchable Archive: http://www.mail-archive.com/[email protected]/

Reply via email to