如何在DBIx :: Class中创建包含相关对象的行对象?

时间:2012-08-15 14:15:05

标签: perl relationship dbix-class

当你DBIx::Class my $author = $authors_rs->find(1); my $book = $books_rs->create({ author => $author, title => 'title' }); 中的一个Row对象时,你可以将相关对象作为值传递,例如

author

但是,如果稍后使用{{1}}访问者,则会再次从数据库中检索该对象。是否可以创建一个对象,以便无需额外查询即可访问关联对象?

2 个答案:

答案 0 :(得分:0)

如何将您想要的内容从$ author复制到一些普通的旧Perl变量中?

如果你想复制整个结构,clone模块可能有帮助(我没有这个模块的经验;我刚刚在网上找到它。)

答案 1 :(得分:0)

我不确定我是否理解正确,但如果我是,也许你想查看prefetch功能,以便自动准备调用其他相关的行对象。

例如,在Galileo中,当列出所有页面(文章)时,我使用此机制来获取每个页面对象(see here)的相关作者对象。


好的,如果要点是将一个对象存储在另一个对象中,您可能需要在对象中注入一些额外的数据。

UNTESTED:

## 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');