Perl DBIx::类链接预取中具有相同表的结果集

Perl DBIx::类链接预取中具有相同表的结果集,perl,dbix-class,Perl,Dbix Class,我正在尝试在我的应用程序中实现resultsets链接 以下是我的resultset类中的一些方法: package Schema::ResultSet::Category; use base 'DBIx::Class::ResultSet'; sub with_translation { my ($self, $lang) = @_; $self->search( { 'language.code' => $lang, }, {

我正在尝试在我的应用程序中实现resultsets链接

以下是我的resultset类中的一些方法:

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;
类生成只包含一个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似乎不提供这种功能。

如果将最终版本更改为此,它应该可以工作:

 $self->db->resultset('Category')
    ->with_translation($lang)->as_subselect_rs
    ->with_products($lang)->as_subselect_rs
    ->display;
我想它会起作用的。问题是它可能会破坏预回迁,我不确定


另一件需要注意的事情是,您正在预取两组has many。我相信这将是“笛卡尔式”的,并将收回大量数据。更好的选择可能是执行2次查询并在perl中合并输出。

->search合并您的参数。您的所有方法都在传递相同的“language.code”散列键,所以它只执行一个。如果想在where子句中包含多个条件,则需要在搜索中使用类似category_i18ns.code的表名。这听起来很合理。非常感谢。