如何在不持久化时为DBIx::Class的has_many关系创建测试数据
解决DBIx::Class内存中关联has_many关系的问题
问题原因
set_from_related 方法主要针对**一对一/多对一(belongs_to/has_one)**关系设计,这类关系对应单个对象;而has_many是集合类型关系,需要接收数组形式的对象集合,直接传入单个对象会导致关联失败。另外add_to_$rel方法会触发数据库持久化操作,不符合你无写入权限的场景。
两种内存关联方案
方案1:给set_from_related传入数组引用
直接将单个或多个书籍对象包装成数组引用,传给has_many类型的关联名:
# 关联单本书籍 $author->set_from_related('books', [$book]); # 关联多本书籍的情况 my $book2 = $s->resultset('Book')->new({ title => 'Another Book', publishing_year => 2010 }); $author->set_from_related('books', [$book, $book2]);
执行后,$author->books->first就能正确获取到关联的书籍对象。
方案2:设置反向关联(推荐)
由于BOOK表必然定义了belongs_to Author的反向关系(假设关系名为author),直接在书籍对象上设置关联即可自动同步到作者的books集合:
$book->set_from_related('author', $author);
这种方式符合DBIx::Class的双向关系设计,无需手动操作集合,内存中会自动维护关联关系,$author->books会自动包含该书籍对象。
验证效果
两种方案执行后,都可以通过以下代码验证关联是否生效:
if (my $first_book = $author->books->first) { print "关联成功:", $first_book->title, "\n"; }
内容的提问来源于stack exchange,提问作者Kriz Dee
相关产品推荐
相关产品推荐

