【问题标题】:How do I add relationships at runtime using DBIx::Class and Catalyst?如何在运行时使用 DBIx::Class 和 Catalyst 添加关系?
【发布时间】:2011-01-16 09:38:11
【问题描述】:

在我正在构建的应用程序中,用户可以指定表之间的关系。

由于我只在运行时确定这一点,因此我无法在架构模块中指定 has_many 或 belongs_to 关系以进行启动。

所以给定两张表;系统和地点,我想添加关系以连接它们之间的记录。

我有以下部分解决方案:

$rs = $c->model('DB::system')->result_source;
$rs->add_relationship('locations','DB::place',{'foreign.fk0' => 'self.id'});

因此列fk0 将是映射到位置主键id 的外键。

我知道必须重新注册才能允许将来访问该关系,但我不知道。

【问题讨论】:

  • 您确定您的用户真的更改了数据库架构吗?这完全等同于允许他们编辑源代码。您不一定需要使用 DBIx::Class 为您的“用户界面”建模。您可能想要开发一些提供您想要的功能的中间表示,并保持您的代码和数据库架构固定。
  • 还有 DBIx::Class::Schema::Loader,如果你正在跟踪一个你无法控制的变化的数据库,或者类似的东西。但请记住,数据库架构更改会改变应用程序的行为。如果您的代码是静态的,而您的数据库架构是动态的,那么几乎可以肯定存在问题。
  • 我正在探索使用我自己的架构/数据字典覆盖在实际数据库上的可能性。我有一个“列”表和一个“表”表。这些用于将用户选择的表和列名称和属性映射到底层通用表空间。因此,用户可以选择在运行时添加表之间的关系。我想通过 DBIx 访问这种关系。我正在构建一个中间接口来隐藏通用模式并需要此功能。谢谢,-乔
  • ... 或者我应该只使用 Catalyst::Model::DBI
  • 即使在 Catalyst 中使用 DBIC,您也可以轻松访问底层 DBI 对象 ($c->model->storage->dbh)。我们一直在我们的 Catalyst/DBIC 应用程序中这样做(事实上,这些天我们可能比直接使用 DBIC 更频繁地这样做——我已经开始讨厌 DBIC 了:)

标签: perl foreign-key-relationship catalyst dbix-class


【解决方案1】:

我不相信您可以在应用程序已经运行后重新定义这些关系。至少不会丢弃任何现有的 DBIC 对象,并从头开始重新创建它们。到那时,我怀疑重新启动您的应用程序会更容易。

如果您满足于在编译时动态定义这些东西,这是可能的……我们在我们的一个应用程序中做了类似的事情。

如果这对你有用,我可以提供一些示例代码。

DBIx::Class::ResultSet::View 模块可以让您执行任意代码,但将结果作为 DBIx 对象检索,从而提供您正在寻找的大致近似值。

我对此类事情的一般看法是,任何抽象层(而 ORM 是一个抽象层)旨在让生活更轻松。当它妨碍你的应用程序做它想做的事情时,它不再让生活更轻松,应该被丢弃(对于特定的用途——不一定适用于所有用途)。出于这个原因,我建议使用 DBI,正如您在其中一个 cmets 中所建议的那样。我怀疑在这种情况下它会让你的生活更轻松。

【讨论】:

  • +1 表示“当它挡道时......”评论。我仍然更喜欢 Class::DBI 而不是 DBIC 的原因之一——我不觉得它会妨碍我。
【解决方案2】:

我通过在相关结果源上调用适当的方法来做到这一点,例如$resultset->result_source-><relationship method>。它甚至在活动的应用程序中也能工作。

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 2011-06-18
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多