当您create
使用 Row 对象时,DBIx::Class
您可以将相关对象作为值传递,例如
my $author = $authors_rs->find(1);
my $book = $books_rs->create({ author => $author, title => 'title' });
但是,如果您稍后使用author
访问器,则会再次从数据库中检索该对象。是否可以创建一个对象,以便无需额外查询即可访问关联的对象?
当您create
使用 Row 对象时,DBIx::Class
您可以将相关对象作为值传递,例如
my $author = $authors_rs->find(1);
my $book = $books_rs->create({ author => $author, title => 'title' });
但是,如果您稍后使用author
访问器,则会再次从数据库中检索该对象。是否可以创建一个对象,以便无需额外查询即可访问关联的对象?
将你想要的东西从 $author 复制到一些普通的旧 Perl 变量中怎么样?
如果您想复制整个结构,克隆模块可能会有所帮助(我没有使用此模块的经验;我只是在网上找到的)。
我不确定我是否正确地理解了您,但如果我是的话,也许您想研究一下prefetch
自动准备好调用那些其他相关行对象的功能。
例如,在Galileo
列出所有页面(文章)时,我使用这种机制来获取每个页面对象的相关作者对象(参见此处)。
好的,如果关键是将一个对象存储在另一个对象中,您可能希望将一些额外的数据注入到对象中。
未经测试:
## some initial checks (run these only once)
# check that method name is available
die "Cannot use method 'extra_data'" if $book->can('extra_data');
# check that the reftype is a hash
require Scalar::Util;
die "Incorrect underlying type" unless Scalar::Util::reftype($book) eq 'HASH';
# check that the key is available
die "Key unavailable" if exists $book->{'my_extra_data'};
{
no strict 'refs';
# create a simple accessor for a hash stored in an object
*{ ref($book) . '::extra_data' } = sub {
my $self = shift;
#return all extra data if called without args
return $self->{my_extra_data} unless @_;
my $key = shift;
if (@_) {
$self->{my_extra_data}{$key} = shift;
}
return $self->{my_extra_data}{$key};
};
}
$book->extra_data( author => $author );
#then later
my $stored_author = $book->extra_data('author');