2

createRowオブジェクトを使用するとDBIx::Class、関連するオブジェクトを値として渡すことができます。

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

ただし、後でauthorアクセサを使用すると、オブジェクトはデータベースから再度取得されます。追加のクエリなしで関連するオブジェクトにアクセスできるようにオブジェクトを作成することは可能ですか?

4

2 に答える 2

0

私があなたを正しく理解しているかどうかはわかりませんが、もしそうなら、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');
于 2012-08-15T17:01:07.153 に答える
0

必要なものを $author から単純な古い Perl 変数にコピーするだけではどうですか?

構造全体をコピーしたい場合は、cloneモジュールが役立つ場合があります (このモジュールの経験はありません。オンラインで見つけたばかりです)。

于 2012-08-15T15:17:56.080 に答える