gpt4 book ai didi

perl - DBIx::Class 插入有很多

转载 作者:行者123 更新时间:2023-12-01 23:54:40 26 4
gpt4 key购买 nike

我正在使用 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;

我想做的是用一个人对象一次添加多个地址。我是这样做的:

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,但这也不起作用。有谁知道我做错了什么?我没有收到任何错误,只是没有插入地址。在文章中他们使用创建而不是插入。是因为这个吗?如果是这样,有没有办法使用 insert 来做到这一点?或 update

最佳答案

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

我怀疑这可能会导致示例中出现问题。你怎么知道 person_id 真的是 1?这是一个自动增量列,您在创建 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;

关于perl - DBIx::Class 插入有很多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24689566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com