[Dbix-class] relationship custom join condition using relation in foreign rel
Peter Mottram
peter at sysnix.com
Tue Jul 29 13:50:02 GMT 2014
I'm using a Message class which has various m2m rels + link tables to
store things such as ProductReview and OrderComment.
I'd like to create an accessor in User which returns only the Message
rows that are ProductReviews as opposed to OrderComments/whatever. The
SQL I'm hoping to build is along these lines:
SELECT messages.*
FROM users me
JOIN messages messages ON me.users_id = messages.author
JOIN product_reviews product_reviews ON messages.messages_id =
product_reviews.messages_id
WHERE me.users_id = ?
I was hoping to use a custom join condition on a has_many relationship
but am getting nowhere. Maybe I should just add a simple sub to User
instead that uses the existing messages rel + some extra join
conditions? Suggestions welcome - simplified classes follow...
TIA
PeteM
## User class
package User;
add_columns( qw/users_id username/ );
has_many( messages => "Message", { 'foreign.author' => 'self.users_id' } );
has_many( reviews => "Message", sub { ** what goes here? ** });
## Message class used for many things including product reviews
package Message;
add_columns( qw/messages_id author/ );
might_have( product_review => 'ProductReview', 'messages_id' );
belongs_to( author => 'User', { 'foreign.users_id' => 'self.author' }, {
join_type => 'left' } );
## ProductReview class isa (kind of) Message
package ProductReview; # link table Product - Message
add_columns( qw/messages_id sku/ );
belongs_to( message => 'Message', "messages_id" );
belongs_to( product => 'Product', "sku" );
## Product class (only shown for clarity)
package Product;
add_columns( qw/sku name/ );
has_many( product_reviews => "ProductReview", "sku" );
many_to_many("reviews", "product_reviews", "message");
More information about the DBIx-Class
mailing list