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

Perl 如何在DBIx::Class中创建包含相关对象的行对象?,perl,relationship,dbix-class,Perl,Relationship,Dbix Class,在DBIx::Class中创建行对象时,可以将相关对象作为值传递,例如 my $author = $authors_rs->find(1); my $book = $books_rs->create({ author => $author, title => 'title' }); 但是,如果以后使用作者访问器,将再次从数据库中检索对象。是否可以创建一个对象,以便在不需要额外查询的情况下访问关联的对象?将您想要的从$author复制到一些简单的旧Perl变量中如何 如果

DBIx::Class
中创建行对象时,可以将相关对象作为值传递,例如

my $author = $authors_rs->find(1);
my $book = $books_rs->create({ author => $author, title => 'title' });

但是,如果以后使用
作者
访问器,将再次从数据库中检索对象。是否可以创建一个对象,以便在不需要额外查询的情况下访问关联的对象?

将您想要的从$author复制到一些简单的旧Perl变量中如何


如果您想复制整个结构,该模块可能会有所帮助(我没有使用该模块的经验;我只是在网上找到它)。

将您想要的从$author复制到一些简单的旧Perl变量中怎么样


如果您想复制整个结构,该模块可能会有所帮助(我没有使用该模块的经验;我只是在网上找到它)。

我不确定我是否正确理解您的意思,但如果我正确理解,您可能希望了解该功能,以便自动准备好调用其他相关行对象

例如,在中,当列出所有页面(文章)时,我使用此机制为每个页面对象()获取相关的author对象


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

未经测试:

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

我不确定我是否正确理解了您的意思,但如果我理解了,您可能希望了解该功能,以便自动准备好调用其他相关的行对象

例如,在中,当列出所有页面(文章)时,我使用此机制为每个页面对象()获取相关的author对象


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

未经测试:

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

prefetch
用于
JOIN
s(即
SELECT
s),而我有不同的用例。我已经有了一个相关的对象,希望将其存储在新创建的对象(具有外键)中,这样就不需要再次检索它(在不同的文件/代码范围中)。好的,因此您有一些代码可以将行对象返回到另一个范围(否则您将需要另一个
选择
)。不能同时返回两个对象而不是一个对象吗?也许您想返回一个集合“object”,其中包含这两个对象?我想说的是,无论通过什么渠道移动行对象,都应该能够同时移动这两个对象。
prefetch
用于
JOIN
s(即
SELECT
s),而我有不同的用例。我已经有了一个相关的对象,希望将其存储在新创建的对象(具有外键)中,这样就不需要再次检索它(在不同的文件/代码范围中)。好的,因此您有一些代码可以将行对象返回到另一个范围(否则您将需要另一个
选择
)。不能同时返回两个对象而不是一个对象吗?也许您想返回一个集合“object”,其中包含这两个对象?我想说的是,无论通过什么渠道移动行对象,都应该能够同时移动这两个对象。这是一个好问题。您可能想在DBIx::Class邮件列表中询问它,开发人员在那里闲逛。在我看来,在创建之后,在书的作用域中缓存author对象应该是可能的。但可能是DBIC总是偏向于检索相关记录以确保新鲜度。您可能想在DBIx::Class邮件列表中询问它,开发人员在那里闲逛。在我看来,在创建之后,在书的作用域中缓存author对象应该是可能的。但可能是DBIC总是偏向于检索相关记录以确保新鲜度。发布到DBIx::Class邮件列表: