/ / DBIx :: Classテーブルの "new"メソッドをオーバーライドする方法 - perl、dbix-class

DBIx :: Classテーブルの "new"メソッドをオーバーライドする方法 - perl、dbix-class

私はここで読んだ http://search.cpan.org/~frew/DBIx-Class-0.08200/lib/DBIx/Class/Manual/Cookbook.pod#Setting_default_values_for_a_row 列のデフォルト値を設定する方法は、 新しい 方法。

私の問題は、私の新しいメソッドが呼び出されないということです。

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オブジェクトを完全に構築し、操作することができます。つまり、私の新しいメソッドが呼び出されることはありません。 何故なの ???

私はそれを周りに移動しようとしましたが、成功することはありません...

回答:

回答№1は2

私はResult / Rowオブジェクトがデータベース内の値から構築されていることを確認します。 この料理ブックに記載されたケースは、例えば新しい行オブジェクトを作成するためのものである。 $ rs-> createを呼び出すことによって。

なぜあなたはデータベースからの値を上書きしたいのですか?

また、aのデフォルト値を設定することもできます"default_value"属性を持つ列。これは、new_resultを使って行オブジェクトを作成し、$ schema-> deployを使用してデータベースをデプロイする場合はデータベースのデフォルト列の値を設定すると、列の値を設定しません。

新しい行オブジェクトの値を設定する場合は、次を参照してください。 DBIx :: Class :: DynamicDefault.


回答№2の場合は0

私は最終的に解決策を見つけました。データベース/ストレージから行オブジェクトのインスタンス化を制御するには、 inflate_default 方法。

ドキュメントから:

すべてのDBIx :: Class :: ResultSetメソッドは、 データベースを作成し、行オブジェクトに変換してこのメ​​ソッドを呼び出します (* inflate_default *)。

Resultクラスでこのメソッドを拡張してこのプロセスにフックし、 たとえば、結果を別のクラスに戻すことができます。

もちろん、新しいメソッドで行オブジェクトのインスタンス化を制御する必要がある場合は、それをオーバーライドする必要があります。

要約すると、行オブジェクトの可能なすべてのインスタンス化をフックする場合は、両方の行オブジェクトをオーバーライドする必要があります inflate_result そして 新しい.