Commit | Line | Data |
b8e1e21f |
1 | package DBIx::Class::Relationship; |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
1edd1722 |
6 | use base qw/DBIx::Class/; |
55e2d745 |
7 | |
07037f89 |
8 | __PACKAGE__->load_own_components(qw/ |
7411204b |
9 | Helpers |
07037f89 |
10 | Accessor |
11 | CascadeActions |
12 | ProxyMethods |
13 | Base |
14 | /); |
b8e1e21f |
15 | |
75d07914 |
16 | =head1 NAME |
34d52be2 |
17 | |
18 | DBIx::Class::Relationship - Inter-table relationships |
19 | |
20 | =head1 SYNOPSIS |
21 | |
75d07914 |
22 | MyDB::Schema::Actor->has_many('actorroles' => 'MyDB::Schema::ActorRole', |
d2113a68 |
23 | 'actor'); |
75d07914 |
24 | MyDB::Schema::Role->has_many('actorroles' => 'MyDB::Schema::ActorRole', |
d2113a68 |
25 | 'role'); |
26 | MyDB::Schema::ActorRole->belongs_to('role' => 'MyDB::Schema::Role'); |
27 | MyDB::Schema::ActorRole->belongs_to('actor' => 'MyDB::Schema::Actor'); |
28 | |
29 | MyDB::Schema::Role->many_to_many('actors' => 'actorroles', 'actor'); |
30 | MyDB::Schema::Actor->many_to_many('roles' => 'actorroles', 'role'); |
31 | |
32 | $schema->resultset('Actor')->roles(); |
33 | $schema->resultset('Role')->search_related('actors', { Name => 'Fred' }); |
fca27358 |
34 | $schema->resultset('ActorRole')->add_to_roles({ Name => 'Sherlock Holmes'}); |
d2113a68 |
35 | |
36 | See L<DBIx::Class::Manual::Cookbook> for more. |
37 | |
34d52be2 |
38 | =head1 DESCRIPTION |
39 | |
bc1171c3 |
40 | This class provides methods to set up relationships between the tables |
41 | in your database model. Relationships are the most useful and powerful |
42 | technique that L<DBIx::Class> provides. To create efficient database queries, |
43 | create relationships between any and all tables that have something in |
44 | common, for example if you have a table Authors: |
45 | |
46 | ID | Name | Age |
47 | ------------------ |
48 | 1 | Fred | 30 |
49 | 2 | Joe | 32 |
50 | |
51 | and a table Books: |
52 | |
53 | ID | Author | Name |
54 | -------------------- |
55 | 1 | 1 | Rulers of the universe |
56 | 2 | 1 | Rulers of the galaxy |
57 | |
58 | Then without relationships, the method of getting all books by Fred goes like |
59 | this: |
60 | |
61 | my $fred = $schema->resultset('Author')->find({ Name => 'Fred' }); |
62 | my $fredsbooks = $schema->resultset('Book')->search({ Author => $fred->ID }); |
63 | With a has_many relationship called "books" on Author (see below for details), |
64 | we can do this instead: |
65 | |
66 | my $fredsbooks = $schema->resultset('Author')->find({ Name => 'Fred' })->books; |
67 | |
75d07914 |
68 | Each relationship sets up an accessor method on the |
bc1171c3 |
69 | L<DBIx::Class::Manual::Glossary/"Row"> objects that represent the items |
70 | of your table. From L<DBIx::Class::Manual::Glossary/"ResultSet"> objects, |
75d07914 |
71 | the relationships can be searched using the "search_related" method. |
bc1171c3 |
72 | In list context, each returns a list of Row objects for the related class, |
73 | in scalar context, a new ResultSet representing the joined tables is |
74 | returned. Thus, the calls can be chained to produce complex queries. |
75 | Since the database is not actually queried until you attempt to retrieve |
76 | the data for an actual item, no time is wasted producing them. |
77 | |
bc0c9800 |
78 | my $cheapfredbooks = $schema->resultset('Author')->find({ |
79 | Name => 'Fred', |
80 | })->books->search_related('prices', { |
81 | Price => { '<=' => '5.00' }, |
82 | }); |
bc1171c3 |
83 | |
84 | will produce a query something like: |
85 | |
75d07914 |
86 | SELECT * FROM Author me |
bc1171c3 |
87 | LEFT JOIN Books books ON books.author = me.id |
88 | LEFT JOIN Prices prices ON prices.book = books.id |
89 | WHERE prices.Price <= 5.00 |
90 | |
91 | all without needing multiple fetches. |
34d52be2 |
92 | |
bfab575a |
93 | Only the helper methods for setting up standard relationship types |
d2113a68 |
94 | are documented here. For the basic, lower-level methods, and a description |
95 | of all the useful *_related methods that you get for free, see |
bfab575a |
96 | L<DBIx::Class::Relationship::Base>. |
503536d5 |
97 | |
34d52be2 |
98 | =head1 METHODS |
99 | |
bfab575a |
100 | All helper methods take the following arguments: |
503536d5 |
101 | |
8091aa91 |
102 | __PACKAGE__>$method_name('relname', 'Foreign::Class', $cond, $attrs); |
bfab575a |
103 | |
104 | Both C<$cond> and C<$attrs> are optional. Pass C<undef> for C<$cond> if |
105 | you want to use the default value for it, but still want to set C<$attrs>. |
8091aa91 |
106 | See L<DBIx::Class::Relationship::Base> for a list of valid attributes. |
503536d5 |
107 | |
bfab575a |
108 | =head2 belongs_to |
503536d5 |
109 | |
c99393ff |
110 | # in a Book class (where Author has many Books) |
d2113a68 |
111 | My::DBIC::Schema::Book->belongs_to(author => 'My::DBIC::Schema::Author'); |
c99393ff |
112 | my $author_obj = $obj->author; |
113 | $obj->author($new_author_obj); |
503536d5 |
114 | |
75d07914 |
115 | Creates a relationship where the calling class stores the foreign class's |
8091aa91 |
116 | primary key in one (or more) of its columns. If $cond is a column name |
117 | instead of a join condition hash, that is used as the name of the column |
118 | holding the foreign key. If $cond is not given, the relname is used as |
119 | the column name. |
bfab575a |
120 | |
2c3ad870 |
121 | If the relationship is optional - ie the column containing the foreign |
122 | key can be NULL - then the belongs_to relationship does the right |
123 | thing - so in the example above C<$obj->author> would return C<undef>. |
124 | However in this case you would probably want to set the C<join_type> |
125 | attribute so that a C<LEFT JOIN> is done, which makes complex |
126 | resultsets involving C<join> or C<prefetch> operations work correctly. |
127 | The modified declaration is shown below:- |
128 | |
129 | # in a Book class (where Author has many Books) |
130 | __PACKAGE__->belongs_to(author => 'My::DBIC::Schema::Author', |
131 | 'author', {join_type => 'left'}); |
132 | |
133 | |
e8e9e5c7 |
134 | Cascading deletes are off per default on a C<belongs_to> relationship, to turn |
135 | them on, pass C<< cascade_delete => 1 >> in the $attr hashref. |
136 | |
8091aa91 |
137 | NOTE: If you are used to L<Class::DBI> relationships, this is the equivalent |
138 | of C<has_a>. |
503536d5 |
139 | |
bfab575a |
140 | =head2 has_many |
503536d5 |
141 | |
c99393ff |
142 | # in an Author class (where Author has many Books) |
d2113a68 |
143 | My::DBIC::Schema::Author->has_many(books => 'My::DBIC::Schema::Book', 'author'); |
c99393ff |
144 | my $booklist = $obj->books; |
bc0c9800 |
145 | my $booklist = $obj->books({ |
146 | name => { LIKE => '%macaroni%' }, |
147 | { prefetch => [qw/book/], |
148 | }); |
c99393ff |
149 | my @book_objs = $obj->books; |
5b89a768 |
150 | my $books_rs = $obj->books; |
151 | ( $books_rs ) = $obj->books_rs; |
503536d5 |
152 | |
c99393ff |
153 | $obj->add_to_books(\%col_data); |
503536d5 |
154 | |
8091aa91 |
155 | Creates a one-to-many relationship, where the corresponding elements of the |
156 | foreign class store the calling class's primary key in one (or more) of its |
157 | columns. You should pass the name of the column in the foreign class as the |
158 | $cond argument, or specify a complete join condition. |
159 | |
60a8fb95 |
160 | Three methods are created when you create a has_many relationship. The first |
161 | method is the expected accessor method. The second is almost exactly the same |
162 | as the accessor method but "_rs" is added to the end of the method name. This |
163 | method works just like the normal accessor, except that it returns a resultset |
164 | no matter what, even in list context. The third method, named |
165 | C<< add_to_<relname> >>, will also be added to your Row items, this allows |
166 | you to insert new related items, using the same mechanism as in |
5b89a768 |
167 | L<DBIx::Class::Relationship::Base/"create_related">. |
d2113a68 |
168 | |
8091aa91 |
169 | If you delete an object in a class with a C<has_many> relationship, all |
e8e9e5c7 |
170 | the related objects will be deleted as well. However, any database-level |
171 | cascade or restrict will take precedence. To turn this behavior off, pass |
172 | C<< cascade_delete => 0 >> in the $attr hashref. |
503536d5 |
173 | |
bfab575a |
174 | =head2 might_have |
503536d5 |
175 | |
75d07914 |
176 | My::DBIC::Schema::Author->might_have(pseudonym => |
d2113a68 |
177 | 'My::DBIC::Schema::Pseudonyms'); |
880a1a0c |
178 | my $pname = $obj->pseudonym; # to get the Pseudonym object |
8091aa91 |
179 | |
c99393ff |
180 | Creates an optional one-to-one relationship with a class, where the foreign |
181 | class stores our primary key in one of its columns. Defaults to the primary |
182 | key of the foreign class unless $cond specifies a column or join condition. |
503536d5 |
183 | |
c99393ff |
184 | If you update or delete an object in a class with a C<might_have> |
185 | relationship, the related object will be updated or deleted as well. |
186 | Any database-level update or delete constraints will override this behaviour. |
e8e9e5c7 |
187 | To turn off this behavior, add C<< cascade_delete => 0 >> to the $attr hashref. |
503536d5 |
188 | |
bfab575a |
189 | =head2 has_one |
190 | |
d2113a68 |
191 | My::DBIC::Schema::Book->has_one(isbn => 'My::DBIC::Schema::ISBN'); |
c99393ff |
192 | my $isbn_obj = $obj->isbn; |
bfab575a |
193 | |
c99393ff |
194 | Creates a one-to-one relationship with another class. This is just like |
195 | C<might_have>, except the implication is that the other object is always |
196 | present. The only difference between C<has_one> and C<might_have> is that |
197 | C<has_one> uses an (ordinary) inner join, whereas C<might_have> uses a |
198 | left join. |
503536d5 |
199 | |
7411204b |
200 | |
87c4e602 |
201 | =head2 many_to_many |
202 | |
303cf522 |
203 | =over 4 |
204 | |
205 | =item Arguments: $accessor_name, $link_rel_name, $foreign_rel_name |
206 | |
207 | =back |
208 | |
75d07914 |
209 | My::DBIC::Schema::Actor->has_many( actor_roles => |
d2113a68 |
210 | 'My::DBIC::Schema::ActorRoles', |
211 | 'actor' ); |
75d07914 |
212 | My::DBIC::Schema::ActorRoles->belongs_to( role => |
d2113a68 |
213 | 'My::DBIC::Schema::Role' ); |
75d07914 |
214 | My::DBIC::Schema::ActorRoles->belongs_to( actor => |
d2113a68 |
215 | 'My::DBIC::Schema::Actor' ); |
216 | |
217 | My::DBIC::Schema::Actor->many_to_many( roles => 'actor_roles', |
71d5ed18 |
218 | 'role' ); |
bc0c9800 |
219 | |
303cf522 |
220 | Creates a accessors bridging two relationships; not strictly a relationship in |
221 | its own right, although the accessor will return a resultset or collection of |
222 | objects just as a has_many would. |
b8eca5ce |
223 | |
d2113a68 |
224 | To use many_to_many, existing relationships from the original table to the link |
75d07914 |
225 | table, and from the link table to the end table must already exist, these |
d2113a68 |
226 | relation names are then used in the many_to_many call. |
7411204b |
227 | |
34d52be2 |
228 | =cut |
229 | |
b8e1e21f |
230 | 1; |
34d52be2 |
231 | |
34d52be2 |
232 | =head1 AUTHORS |
233 | |
daec44b8 |
234 | Matt S. Trout <mst@shadowcatsystems.co.uk> |
34d52be2 |
235 | |
236 | =head1 LICENSE |
237 | |
238 | You may distribute this code under the same terms as Perl itself. |
239 | |
240 | =cut |
241 | |