NAME
Mad::Mapper::Guides::HasMany - "Has many" relationship
OVERVIEW
This guide will show how to define and use a "has many" relationship.
GUIDE
Define a relationship
package MyApp::Model::User;
use Mad::Mapper -base;
# define a primary key
pk id => undef;
# define a relationship
has_many groups => "MyApp::Model::Group", "id_user";
The code above describes that the "id_user" column in the "groups" table should reference back to the "id" (primary key) column in the "users" table.
Automatically defined methods
The "groups" relationship defined above will generate two methods: groups()
and add_group()
. The first is to get all the group rows and the latter is to add a new group row.
Usage
my $user = MyApp::Model::User->new(db => $pg->db, id => 42);
Need to create a $user
object first. After that we can retrieve groups and/or add groups.
# sync
my $groups = $user->groups;
# async
Mojo::IOLoop->delay(
sub {
my ($delay) = @_;
$self->groups($delay->begin);
},
sub {
my ($delay, $err, $groups) = @_;
},
);
$groups
is a Mojo::Collection of MyApp::Model::Group
objects.
# add_group() is a sync method
$group = $self->add_group(\%constructor_args);
# save() can be called sync and async.
$group->save;
add_group
will just create a new MyApp::Model::Group
object. You need to insert that object as a separate step.
Custom query
You can define your own query:
has_many groups_sorted => "MyApp::Model::Group";
sub _has_many_groups_sorted_sql {
my ($self, $related_class, @extra) = @_;
return $related_class->expand_sql(
"SELECT %pc FROM %t WHERE user_id=? order by name", $self->id
);
}
Note above that @extra
is any extra arguments passed on to the method:
$user->groups_sorted("extra", "args");
COPYRIGHT AND LICENSE
Copyright (C) 2014-2016, Jan Henning Thorsen
This program is free software, you can redistribute it and/or modify it under the terms of the Artistic License version 2.0.
AUTHOR
Jan Henning Thorsen - jhthorsen@cpan.org