DBIx :: Class链接结果集,在预取中具有相同的表

时间:2014-11-24 10:53:57

标签: perl dbix-class

我正在尝试在我的应用程序中实现结果集链接。

以下是我的结果集类中的一些方法:

package Schema::ResultSet::Category;

use base 'DBIx::Class::ResultSet';

sub with_translation {
  my ($self, $lang) = @_;

  $self->search(
    {
      'language.code' => $lang,
    },
    {
      prefetch => {
        'category_i18ns' => 'language'
      }
    }
  );
}

sub with_products {
  my ($self, $lang) = @_;

  $self->search(
    {
      'language.code' => $lang,
    },
    {
      prefetch => {
        'products' => {
          'product_i18ns' => 'language',
        },
      },
    },
  );
}

sub with_categories {
  my ($self, $lang) = @_;

  $self->search(
    {
      'language.code' => $lang,
    },
    {
      prefetch => {
        'parent' => {
          'category_i18ns' => 'language'
        },
      },
    }
  );
}

sub with_account {
  my ($self) = @_;

  $self->search(
    undef,{
    prefetch => ['account'],
  });
}

sub display {
  my ($self) = @_;

  $self->result_class('DBIx::Class::ResultClass::HashRefInflator');

  my @return = $self->all;

  return \@return;
}

当我以这种方式打电话给链时:

my @categories = $self->db->resultset('Category')->with_translation($lang)->with_products($lang)->display;

DBIx :: Class生成只包含一个WHERE子句的SELECT查询:

SELECT [...] WHERE ( language.code = ? ): 'en'

根据DBIx :: Class :: ResultSet文档中描述的解析规则的属性和条件的预期。但是,如何为每个相关的“language.code”列生成带有多个WHERE子句的查询?例如,像这样:

SELECT [...] WHERE (( language.code = ? ) AND ( language_2.code = ? )): 'en', 'en'

据我所知,问题是在链调用期间正在合并搜索条件,因此我需要检索当前的“语言”别名并在每个链元素的搜索条件中使用它,但似乎DBIx :: Class doesn'提供这样的能力。

1 个答案:

答案 0 :(得分:0)

如果您将最终版本更改为此版本,则应该有效:

 $self->db->resultset('Category')
    ->with_translation($lang)->as_subselect_rs
    ->with_products($lang)->as_subselect_rs
    ->display;

我认为它会起作用。问题是它可能会破坏预取,我不是正面的......

另一件需要注意的事情是,你要预取两组有manys。我相信这将是"笛卡尔"并撤回一大堆数据。一个更好的选择可能是做2个查询并合并perl中的输出。