我正在尝试在我的应用程序中实现结果集链接。
以下是我的结果集类中的一些方法:
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'提供这样的能力。
答案 0 :(得分:0)
如果您将最终版本更改为此版本,则应该有效:
$self->db->resultset('Category')
->with_translation($lang)->as_subselect_rs
->with_products($lang)->as_subselect_rs
->display;
我认为它会起作用。问题是它可能会破坏预取,我不是正面的......
另一件需要注意的事情是,你要预取两组有manys。我相信这将是"笛卡尔"并撤回一大堆数据。一个更好的选择可能是做2个查询并合并perl中的输出。