DBIx :: Class insert有很多

时间:2014-07-11 03:21:08

标签: perl catalyst dbix-class

我使用DBIx::Class并且我有两个模式:

use utf8;
package MyApp::Schema::Result::Person;

use Moose;
use MooseX::NonMoose;
use MooseX::MarkAsMethods autoclean => 1;
extends 'DBIx::Class::Core';

__PACKAGE__->table("person");

__PACKAGE__->add_columns(
    "id",
     { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
);

__PACKAGE__->has_many(
    "addresses",
    "MyApp::Schema::Result::Address",
    { "foreign.person_id" => "self.id" },
    { cascade_copy => 0, cascade_delete => 0 },
);

1;

use utf8;
package MyApp::Schema::Result::Address;

use Moose;
use MooseX::NonMoose;
use MooseX::MarkAsMethods autoclean => 1;
extends 'DBIx::Class::Core';

__PACKAGE__->table("address");

__PACKAGE__->add_columns(
    "id",
     { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
     "person_id",
     { data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
);

__PACKAGE__->belongs_to(
    "person",
     "MyApp::Schema::Result::Person",
     { id => "person_id" },
     {  
         is_deferrable => 0,
         join_type     => "LEFT",
         on_delete     => "NO ACTION",
         on_update     => "NO ACTION",
     },  
);

1;

我要做的是一次使用person对象添加多个地址。我这样做是这样的:

my $person = $c->model('DB::Person')->new_result({});
$person->addresses([
    {
        id => 1,
        person_id => 1,
    },
    {
        id => 2,
        person_id => 1,
    },
]);

$person->insert;

我从这个article开始遵循这种格式,但它似乎不起作用。仅插入人员行,但与其关联的地址不会插入。在插入之前,我还尝试将addresses设置为MyApp::Schema::Result::Address个对象的arrayref,但这也不起作用。有谁知道我做错了什么?我没有收到任何错误,它只是没有插入地址。在文章中,他们使用create而不是insert。是因为这个吗?如果是,有没有办法使用insertupdate

执行此操作

3 个答案:

答案 0 :(得分:2)

添加相关子记录时,无需为子项指定外键值。这种关系应该自动为您解决这个问题。例如在你的例子中,person_id是不必要的。

我怀疑这可能会导致示例中出现问题。你怎么知道person_id真的是1?它是一个自动增量列,当您创建Person时,您没有显式传入值。

这会发生什么:

- 在Person.pm -

__PACKAGE__->add_columns(
    "id",
     { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
    "name",
     { data_type => "varchar"},
);

- 在Address.pm -

__PACKAGE__->add_columns(
    "id",
     { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
     "person_id",
     { data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
    "street",
     { data_type => "varchar"},

);

然后这个插入代码:

my $person = $c->model('DB::Person')->new_result({ name => "Bob" });
$person->addresses([
    {
        street => "Apple Street",
    },
    {
        street => "Orange Avenue",
    },
]);

$person->insert;

答案 1 :(得分:1)

我原以为belongs_to中的Address关系看起来应该是

{ 'foreign.id' => 'self.person_id' }

因为id不明确而没有指定表名。

您似乎在has_many

Person关系中正确使用了它

答案 2 :(得分:0)

我很确定它与仅在内存中创建的Person对象有关,请尝试使用create。

您是否有理由在分配地址后插入它?

请注意,在一个DBIx :: Class :: Schema中有两个DBIx :: Class :: Result类。

您也不应该覆盖自动增量列值,因为您的数据库不会知道这些ID已经被使用,并且稍后尝试这样做会导致难以追踪错误。