| | 1170 | sub search_by_meta { |
|---|
| | 1171 | my $class = shift; |
|---|
| | 1172 | my($key, $value, $terms, $args) = @_; |
|---|
| | 1173 | $terms ||= {}; $args ||= {}; |
|---|
| | 1174 | return unless $class->properties->{meta_installed}; |
|---|
| | 1175 | return $class->error("Unknown meta '$key' on $class") |
|---|
| | 1176 | unless $class->is_meta_column($key); |
|---|
| | 1177 | |
|---|
| | 1178 | my $meta_rec = MT::Meta->metadata_by_name($class, $key); |
|---|
| | 1179 | my $type_col = $meta_rec->{type}; |
|---|
| | 1180 | my $type_id = $meta_rec->{name}; |
|---|
| | 1181 | my $meta_terms = { |
|---|
| | 1182 | $type_col => $value, |
|---|
| | 1183 | type => $type_id, |
|---|
| | 1184 | %$terms, |
|---|
| | 1185 | }; |
|---|
| | 1186 | my $meta_class = $class->meta_pkg; |
|---|
| | 1187 | my $meta_pk = $meta_class->primary_key_tuple; |
|---|
| | 1188 | my @metaobjs = $meta_class->search( |
|---|
| | 1189 | $meta_terms, { %$args, fetchonly => $meta_pk } |
|---|
| | 1190 | ); |
|---|
| | 1191 | |
|---|
| | 1192 | my $pk = $class->primary_key_tuple; |
|---|
| | 1193 | my $get_pk = sub { |
|---|
| | 1194 | my $meta = shift; |
|---|
| | 1195 | [ map { $meta->$_ } @$meta_pk ]; |
|---|
| | 1196 | }; |
|---|
| | 1197 | |
|---|
| | 1198 | return unless @metaobjs; |
|---|
| | 1199 | return grep defined, @{ $class->lookup_multi([ map { $get_pk->($_) } @metaobjs ]) }; |
|---|
| | 1200 | } |
|---|
| | 1201 | |
|---|