gpt4 book ai didi

perl - DBIx::Class 链接结果集与预取中的相同表

转载 作者:行者123 更新时间:2023-12-02 04:52:06 25 4
gpt4 key购买 nike

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

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

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 没有不提供这样的能力。

最佳答案

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

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

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

另一件需要注意的事情是你预取了两组 has manys。我相信这将“笛卡尔”并拉回一个庞大的数据集。更好的选择可能是执行 2 个查询并在 perl 中合并输出。

关于perl - DBIx::Class 链接结果集与预取中的相同表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27103138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com