1

我在这里读过http://search.cpan.org/~frew/DBIx-Class-0.08200/lib/DBIx/Class/Manual/Cookbook.pod#Setting_default_values_for_a_row,一种为列设置默认值的方法是覆盖的方法。

我的问题是我的新方法永远不会被调用。

用户.pm

package MyApp::SchemaTest::Result::User;
use strict;
use warnings;
use base qw/DBIx::Class::Core/;

sub new {
    die "new: @_";
}
__PACKAGE__->table("GECKO_USER");
__PACKAGE__->add_columns(
  "user_id",
  { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
  "first_name",
  { data_type => "varchar2", is_nullable => 0, size => 45 },
  "last_name",
  { data_type => "varchar2", is_nullable => 0, size => 45 } );
__PACKAGE__->set_primary_key("user_id");

1;

测试.pl

use Gecko2::SchemaTest;

my $schema = Gecko2::SchemaTest->connect("dbi:SQLite:$FindBin::Bin/../db/gecko2.sqlite");
ok($schema, "got schema");

my $user = $schema->resultset('User')->find( { login => 'toto' });
use DDP;
p $user;

而且我得到了完全构造和可操作的 $user 对象,这意味着我的全新方法永远不会被调用。 为什么不 ???

我试图移动它但没有任何成功......

4

2 回答 2

2

我你调用 find 一个 Result/Row 对象是从数据库中的值构造的。食谱中描述的案例是用于创建新的行对象,例如通过调用 $rs->create。

为什么要覆盖来自数据库的值?

请注意,您还可以使用“default_value”属性为列设置默认值。如果使用 new_result 构造行对象,则不会设置列值,但如果使用 $schema->deploy 部署数据库,则设置数据库默认列值。

如果要设置新行对象的值,请查看DBIx::Class::DynamicDefault

于 2012-09-04T17:27:32.827 回答
0

我最终找到了解决方案:要控制数据库/存储中行对象的实例化,您需要覆盖inflate_default方法。

从文档:

从数据库中检索数据并将其转换为行对象的所有 DBIx::Class::ResultSet 方法都调用此方法 (*inflate_default*)。

在您的 Result 类中扩展此方法以挂钩此过程,例如将结果重新分配到不同的类中。

当然如果你需要通过新方法来控制行对象的实例化,你必须重写它。

总而言之,如果你想挂钩行对象的每个可能的实例化,你必须同时覆盖inflate_resultnew

于 2012-09-12T16:55:19.017 回答