Thanks Emmanuel, worked as I wanted to, much appreciated.<br><h3 class="gD" style="color: rgb(91, 16, 148);"><span></span></h3><br><div class="gmail_quote">On Tue, Nov 30, 2010 at 10:25 PM, Emmanuel OTTON <span dir="ltr">&lt;<a href="mailto:otton@mines-albi.fr">otton@mines-albi.fr</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Le 30 nov. 2010 à 17:02, linuxsupport a écrit :<br>
<div><div></div><div class="h5"><br>
&gt; Hi,<br>
&gt; I am new to Catalyst and DBIx::Class, trying to use many_to_many<br>
&gt; relationship.<br>
&gt; I have 3 tables, users, user_groups, and group, table structure and<br>
&gt; relationship are setup as follows.<br>
&gt;<br>
&gt; User.pm<br>
&gt; __PACKAGE__-&gt;add_columns(<br>
&gt;  &quot;id&quot;,<br>
&gt;  { data_type =&gt; &quot;integer&quot;, is_nullable =&gt; 0 },<br>
&gt;  &quot;username&quot;,<br>
&gt;  { data_type =&gt; &quot;text&quot;, is_nullable =&gt; 1 },<br>
&gt;  &quot;password&quot;,<br>
&gt;  { data_type =&gt; &quot;text&quot;, is_nullable =&gt; 1 },<br>
&gt;  &quot;email_address&quot;,<br>
&gt;  { data_type =&gt; &quot;text&quot;, is_nullable =&gt; 1 },<br>
&gt;  &quot;first_name&quot;,<br>
&gt;  { data_type =&gt; &quot;text&quot;, is_nullable =&gt; 1 },<br>
&gt;  &quot;last_name&quot;,<br>
&gt;  { data_type =&gt; &quot;text&quot;, is_nullable =&gt; 1 },<br>
&gt;  &quot;active&quot;,<br>
&gt;  { data_type =&gt; &quot;integer&quot;, is_nullable =&gt; 1 },<br>
&gt; );<br>
&gt; __PACKAGE__-&gt;set_primary_key(&quot;id&quot;);<br>
&gt;<br>
&gt; __PACKAGE__-&gt;has_many(&quot;usergroups&quot;, &quot;Example::Schema::Result::UserGroup&quot;,{<br>
&gt; &quot;foreign.user_id&quot; =&gt; &quot;<a href="http://self.id" target="_blank">self.id</a>&quot; },);<br>
&gt; __PACKAGE__-&gt;many_to_many(group =&gt; &#39;usergroups&#39;, &#39;group&#39;);<br>
&gt;<br>
&gt; UserGroup.pm<br>
&gt;<br>
&gt; __PACKAGE__-&gt;add_columns(<br>
&gt;  &quot;user_id&quot;,<br>
&gt;  { data_type =&gt; &quot;integer&quot;, is_nullable =&gt; 0 },<br>
&gt;  &quot;group_id&quot;,<br>
&gt;  { data_type =&gt; &quot;integer&quot;, default_value =&gt; 0, is_nullable =&gt; 0 },<br>
&gt; );<br>
&gt; __PACKAGE__-&gt;set_primary_key(&quot;user_id&quot;, &quot;group_id&quot;);<br>
&gt;<br>
&gt; __PACKAGE__-&gt;belongs_to(&quot;user&quot;, &quot;Example::Schema::Result::User&quot;, { id =&gt;<br>
&gt; &quot;user_id&quot; },{ join_type =&gt; &quot;LEFT&quot; },);<br>
&gt; __PACKAGE__-&gt;belongs_to(&quot;group&quot;, &quot;Example::Schema::Result::Group&quot;, { id =&gt;<br>
&gt; &quot;group_id&quot; },{ join_type =&gt; &quot;LEFT&quot; },);<br>
&gt;<br>
&gt; Group.pm<br>
&gt;<br>
&gt; __PACKAGE__-&gt;add_columns(<br>
&gt;  &quot;id&quot;,<br>
&gt;  { data_type =&gt; &quot;integer&quot;, is_nullable =&gt; 0 },<br>
&gt;  &quot;group&quot;,<br>
&gt;  { data_type =&gt; &quot;text&quot;, is_nullable =&gt; 0 },<br>
&gt; );<br>
&gt; __PACKAGE__-&gt;set_primary_key(&quot;id&quot;);<br>
&gt;<br>
&gt; __PACKAGE__-&gt;has_many(&quot;usergroup&quot;,&quot;Example::Schema::Result::UserGroup&quot;,{<br>
&gt; &quot;foreign.group_id&quot; =&gt; &quot;<a href="http://self.id" target="_blank">self.id</a>&quot; },);<br>
&gt;<br>
&gt; Can anyone tell me how I can retrieve all the users who are member of a<br>
&gt; group called &#39;manager&#39;?<br>
<br>
</div></div>1 - DECLARATION<br>
---------------<br>
First, declare your N:M link from group to user, using the method many_to_many, i.e. in your Group.pm, manually add this (at the end of the file, AFTER the line that says &quot;DO NOT MODIFY THIS OR ANYTHING ABOVE&quot; if you generated your classes using the DBIx::Class::Schema::Loader method &quot;make_schema_at&quot;, which I highly recommend over the tedious manual method ):<br>


<br>
__PACKAGE__-&gt;many_to_many(&#39;users&#39;,&#39;usergroup&#39;,&#39;user&#39;);<br>
<br>
This many_to_many method adds to any Group object an accessor called &quot;users&quot;, giving directly access to the linked users.<br>
The 3 arguments are a name and two accessors constituting the path to be used:<br>
 - the accessor name, chosed by you (I tend to recommand the plural, which by the way you did not use for your &quot;has_many&quot; accessors)<br>
 - the has_many accessor leading from Group to UserGroup,<br>
 - the belongs_to accessor leading from UserGroup to User.<br>
<br>
2 - USE<br>
-------<br>
Then, when you need your users (supposing there is only one group called &#39;manager&#39;), you just have to get your Group object, and apply the just created accessor on it:<br>
<br>
my $manager_group = $schema-&gt;resultset(&#39;Group&#39;)-&gt;search( { group =&gt; &#39;manager&#39; } )-&gt;next;<br>
my @users_belonging_to_manager_group = $manager_group-&gt;users;<br>
<br>
And voila.<br>
<br>
By the way, the many_to_many method has also created a &quot;add_to_users&quot; method:<br>
Suppose Joe was just promoted as manager:<br>
my $joe = $schema-&gt;resultset(&#39;User&#39;)-&gt;find(&#39;Joe&#39;);<br>
my $manager_group = $schema-&gt;resultset(&#39;Group&#39;)-&gt;search( { group =&gt; &#39;manager&#39; } )-&gt;next;<br>
$manager_group-&gt;add_to_users($joe);<br>
<br>
The last line does the right thing(s) to link joe to the manager group.<br>
<br>
I&#39;ve been using it since a long time, it works like a charm.<br>
<font color="#888888">--<br>
Emmanuel OTTON - Responsable informatique - Ecole des mines d&#39;Albi-Carmaux - Tél: 05 63 49 30 86<br>
</font><div><div></div><div class="h5"><br>
<br>
_______________________________________________<br>
List: <a href="mailto:Catalyst@lists.scsys.co.uk">Catalyst@lists.scsys.co.uk</a><br>
Listinfo: <a href="http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst" target="_blank">http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst</a><br>
Searchable archive: <a href="http://www.mail-archive.com/catalyst@lists.scsys.co.uk/" target="_blank">http://www.mail-archive.com/catalyst@lists.scsys.co.uk/</a><br>
Dev site: <a href="http://dev.catalyst.perl.org/" target="_blank">http://dev.catalyst.perl.org/</a><br>
</div></div></blockquote></div><br>