这是我的情况:我们拥有与属性表关系的主表。有时,我们会自行获取一行:
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的一部分,我还是非常反对以这种方式使用它。)
答案 0 :(得分:-1)
使用关系方法,如果预取了关系,则使用缓存的相关行,否则自动执行查询。
请注意,加入不会填充缓存,只有预取功能。
搜索将始终发出查询,并且永远不会像您的grep示例那样通过Perl代码限制结果集。