我在这里阅读http://search.cpan.org/~frew/DBIx-Class-0.08200/lib/DBIx/Class/Manual/Cookbook.pod#Setting_default_values_for_a_row,为列设置默认值的方法是覆盖 new 方法。
我的问题是我的新方法永远不会被调用。
User.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;
test.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对象完全构造并且可操作,这意味着我的全新方法永远不会被调用。 为什么不???
我试图移动它但没有任何成功......
答案 0 :(得分:2)
我调用查找结果/行对象是根据数据库中的值构造的。 在食谱中描述的情况是用于创建新的行对象,例如通过拨打$ rs->创建。
为什么要覆盖来自数据库的值?
请注意,您还可以使用“default_value”属性为列设置默认值。如果使用new_result构造行对象,则不会设置列值,但如果使用$ schema-> deploy部署数据库,则不会设置数据库默认列值。
如果要设置新行对象的值,请查看DBIx::Class::DynamicDefault。
答案 1 :(得分:0)
我最终找到了解决方案:要控制数据库/存储中行对象的实例化,您需要覆盖 inflate_default 方法。
来自doc:
从中检索数据的所有DBIx :: Class :: ResultSet方法 数据库并将其转换为行对象调用此方法 (* inflate_default *)。
在Result类中扩展此方法以挂接到此进程, 例如,将结果重新评估为不同的类。
当然,如果您需要通过新方法控制行对象的实例化,则必须覆盖它。
总而言之,如果要挂钩行对象的每个可能的实例化,则必须覆盖 inflate_result 和 new 。