Perl DBIx::类链接预取中具有相同表的结果集
我正在尝试在我的应用程序中实现resultsets链接 以下是我的resultset类中的一些方法: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, }, {
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的表名。这听起来很合理。非常感谢。