如何确定DBIx :: Class :: Row是否已经获取了一个关系?

时间:2018-02-12 15:16:25

标签: dbix-class

这是我的情况:我们拥有与属性表关系的主表。有时,我们会自行获取一行:

my $row = $rs->search({ some_key => 'some_value' })->first;

有时我们加入一个或多个表格:

my $row = $rs->search({ some_key => 'some_value' }, { join => 'attributes' });

我们有帮助"查找特定属性的方法:

sub get_x_attr {
  my $obj = shift;
  my $x_attr = $obj->attributes->search({ attribute_name => 'x' })->one_row;
  return $x_attr ? $x_attr->attribute_value : 'default';
}

这似乎会发出另一个查询,虽然它是一个影响力非常小的查询,但是当你每天做数十万次时,这些问题就会加起来。

现在,如果该行最初是连接的,我可以将帮助器编写为:

my @attrs = grep { $_->attribute_name eq 'x' } $obj->attributes->all;
my $x_attribute = $attrs[0] || return 'default';
# etc.

并且没有其他查询。

这是我的问题:是否有一种安全,可靠的方式来审讯" $ obj"看看它是否预先获得了属性?而且,有没有办法告诉事实,如果连接是有条件的(例如,' WHERE attribute_name =' some_other_value',这会使$ obj->属性在这里相当无用)?

(我做了一些挖掘,发现$ obj-> {internals} {related_resultsets}有第一个问题的答案,但由于它不是暴露的API的一部分,我还是非常反对以这种方式使用它。)

1 个答案:

答案 0 :(得分:-1)

使用关系方法,如果预取了关系,则使用缓存的相关行,否则自动执行查询。

请注意,加入不会填充缓存,只有预取功能。

搜索将始终发出查询,并且永远不会像您的grep示例那样通过Perl代码限制结果集。