如何使用DBIx :: Class和Catalyst在运行时添加关系?

时间:2010-02-13 01:28:15

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

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

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

所以给了两张桌子;系统和地点,我想添加关系来加入它们之间的记录。

我有以下解决方案的一部分:

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

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

我知道必须重新注册以允许将来访问该关系,但我无法理解。

2 个答案:

答案 0 :(得分:1)

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

如果您想在编译时动态定义这些内容,那么这是可能的......我们在其中一个应用程序中做了类似的事情。

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

DBIx::Class::ResultSet::View模块可以通过让您执行任意代码,但将结果作为DBIx对象检索来粗略估计您要查找的内容。

我对这类事情的一般看法是,任何抽象层(和ORM是一个抽象层),都是为了让生活更轻松。当它妨碍你的应用程序按照自己的意愿行事时,它不再让生活更轻松,而且应该被丢弃(针对特定用途 - 不一定适用于所有用途)。出于这个原因,我建议您使用DBI,正如您在其中一条评论中所建议的那样。我怀疑在这种情况下它会让你的生活更轻松。

答案 1 :(得分:0)

我通过在相关结果源上调用适当的方法来完成此操作,例如: $resultset->result_source-><relationship method>。它甚至在活动应用程序中也能正常工作。