use DBIx::Class::ResultSetColumn;
use base qw/DBIx::Class/;
-use Data::Dumper; $Data::Dumper::Indent = 1;
-
__PACKAGE__->load_components(qw/AccessorGroup/);
__PACKAGE__->mk_group_accessors('simple' => qw/result_source result_class/);
"' has no such relationship $rel")
unless $rel_obj;
- my ($from,$seen) = $self->search(undef, { join => $rel })->_resolve_from;
+ my ($from,$seen) = $self->_resolve_from($rel);
- my $join_count = $self->{attrs}{seen_join}{$rel};
- my $alias = $join_count ? join('_', $rel, $join_count+1) : $rel;
+ my $join_count = $seen->{$rel};
+ my $alias = ($join_count > 1 ? join('_', $rel, $join_count) : $rel);
$self->result_source->schema->resultset($rel_obj->{class})->search_rs(
undef, {
alias => $alias,
where => $self->{cond},
seen_join => $seen,
- _parent_from => $from,
+ from => $from,
});
};
}
sub _resolve_from {
- my ($self) = @_;
+ my ($self, $extra_join) = @_;
my $source = $self->result_source;
my $attrs = $self->{attrs};
- my $from = $attrs->{_parent_from}
+ my $from = $attrs->{from}
|| [ { $attrs->{alias} => $source->from } ];
my $seen = { %{$attrs->{seen_join}||{}} };
- if ($attrs->{join}) {
- push(@{$from},
- $source->resolve_join($attrs->{join}, $attrs->{alias}, $seen)
- );
- }
+ my $join = ($attrs->{join}
+ ? [ $attrs->{join}, $extra_join ]
+ : $extra_join);
+ push(@{$from},
+ $source->resolve_join($join, $attrs->{alias}, $seen)
+ );
return ($from,$seen);
}
push(@{$attrs->{as}}, @$adds);
}
- $attrs->{from} ||= delete $attrs->{_parent_from}
- || [ { 'me' => $source->from } ];
+ $attrs->{from} ||= [ { 'me' => $source->from } ];
if (exists $attrs->{join} || exists $attrs->{prefetch}) {
my $join = delete $attrs->{join} || {};
);
}
- push(@{$attrs->{from}},
- $source->resolve_join($join, $alias, { %{$attrs->{seen_join}||{}} })
- );
+ $attrs->{from} = # have to copy here to avoid corrupting the original
+ [
+ @{$attrs->{from}},
+ $source->resolve_join($join, $alias, { %{$attrs->{seen_join}||{}} })
+ ];
}
$attrs->{group_by} ||= $attrs->{select} if delete $attrs->{distinct};