【问题标题】:How do I insert data via DBIx for Many to Many relationship?如何通过 DBIx 为多对多关系插入数据?
【发布时间】:2013-11-20 09:11:08
【问题描述】:

我正在努力了解 DBiX,但当我有多对多关系时,我正在努力解决如何将数据插入到我的数据库中。

在下面的示例中,对象和网络之间存在多对多关系。

一个对象有一个名称和描述 一个网络有一个 IP 和一个网络掩码

我有一个多对多关系的联结表。

如何添加对象及其关联的网络?

例如我有

object
—————
Name : TestObject1
Description: TestObject1

通过以下网络

IP:1.1.1.1
Netmask:255.255.255.255

IP:2.2.2.2
Netmask:255.255.255.255

Name : TestObject2
Description: TestObject2

与以下网络

IP:1.1.1.1
Netmask:255.255.255.255

IP:3.3.3.3
Netmask:255.255.255.255

我知道如何插入具有一对多关系的数据,但我不知道如何处理多对多。理想情况下,我希望能够构建我的数据结构,然后一次性添加所有内容。

以下是模式加载器创建的相关表。

谢谢。

Object Table
------------

__PACKAGE__->table("Object");
__PACKAGE__->add_columns(
  "objectid",
  { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
  "description",
  { data_type => "varchar", is_nullable => 1, size => 100 },
  "objectname",
  { data_type => "varchar", is_nullable => 0, size => 100 },
);
__PACKAGE__->set_primary_key("objectid");

__PACKAGE__->has_many(
  "object_has_networks",
  "TestApp::Schema::Result::ObjectHasNetwork",
  { "foreign.object_objectid" => "self.objectid" },
  { cascade_copy => 0, cascade_delete => 0 },
);

__PACKAGE__->many_to_many(
  "network_networkids",
  "object_has_networks",
  "network_networkid",
);


 Network Table
 ------------

__PACKAGE__->table("network");
__PACKAGE__->add_columns(
  "networkid",
  { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
  “IP”,
  { data_type => "varchar", is_nullable => 1, size => 15 },
  "netmask",
  { data_type => "varchar", is_nullable => 1, size => 15 },
);
__PACKAGE__->set_primary_key("networkid");

__PACKAGE__->has_many(
  "object_has_networks",
  "TestApp::Schema::Result::ObjectHasNetwork",
  { "foreign.network_networkid" => "self.networkid" },
  { cascade_copy => 0, cascade_delete => 0 },
);
__PACKAGE__->many_to_many("object_objectids", "object_has_networks", "object_objectid");



Junction Table
--------------
__PACKAGE__->table("Object_has_network");
__PACKAGE__->add_columns(
  "object_objectid",
  { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
  "network_networkid",
  { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
);
__PACKAGE__->set_primary_key("object_objectid", "network_networkid");:wq
__PACKAGE__->belongs_to(
  "network_networkid",
  "TestApp::Schema::Result::Network",
  { networkid => "network_networkid" },
  { is_deferrable => 1, on_delete => "NO ACTION", on_update => "NO ACTION" },
);

__PACKAGE__->belongs_to(
  "object_objectid",
  "TestApp::Schema::Result::Object",
  { objectid => "object_objectid" },
  { is_deferrable => 1, on_delete => "NO ACTION", on_update => "NO ACTION" },
);

【问题讨论】:

    标签: mysql sql perl orm dbix-class


    【解决方案1】:

    First DBIx 是一个完整的命名空间,其中 DBIx::Class 只是一个 dist。常见的缩写是 DBIC。

    多对多不是关系,而是辅助,因此您只需指定构成 m2m 关系桥梁的两个关系,用于搜索和插入。

    【讨论】:

    • 您好,感谢您的回复。看来我还有一些阅读要做。我将尝试一些代码并用我尝试过的内容更新这篇文章。谢谢。
    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 2018-12-29
    • 2019-04-10
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多