我使用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。是因为这个吗?如果是,有没有办法使用insert或update?
答案 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已经被使用,并且稍后尝试这样做会导致难以追踪错误。