Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何使用DBIx::Class和Catalyst在运行时添加关系?_Perl_Foreign Key Relationship_Catalyst_Dbix Class - Fatal编程技术网

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

Perl 如何使用DBIx::Class和Catalyst在运行时添加关系?,perl,foreign-key-relationship,catalyst,dbix-class,Perl,Foreign Key Relationship,Catalyst,Dbix Class,在我正在构建的应用程序中,用户可以指定表之间的关系 因为我只在运行时确定这一点,所以我不能在启动模式模块中指定has\u many或belling\u to关系 因此给出了两个表;系统和位置,我想添加连接它们之间记录的关系 我有以下部分解决方案: $rs = $c->model('DB::system')->result_source; $rs->add_relationship('locations','DB::place',{'foreign.fk0' => 'sel

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

因为我只在运行时确定这一点,所以我不能在启动模式模块中指定has\u many或belling\u to关系

因此给出了两个表;系统和位置,我想添加连接它们之间记录的关系

我有以下部分解决方案:

$rs = $c->model('DB::system')->result_source;
$rs->add_relationship('locations','DB::place',{'foreign.fk0' => 'self.id'});
因此,列
fk0
将是映射到位置主键
id
的外键


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

我不相信在应用程序已经运行后,您可以重新定义这些关系。至少在不丢弃任何现有DBIC对象并从头开始重新创建它们的情况下是如此。在这一点上,我想重新启动应用程序会更容易

如果您在编译时动态定义这些内容,那么这是可能的。。。我们在其中一个应用程序中执行类似的操作

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

通过允许您执行任意代码,但以DBIx对象的形式检索结果,该模块可能会提供一个粗略的近似值


我对这类事情的总体看法是,任何抽象层(ORM就是抽象层)都是为了让生活更轻松。当它阻碍了应用程序实现它想要的功能时,它就不再让您的生活更轻松,应该放弃它(对于特定的用途——不一定是每种用途)。因此,我建议使用DBI,正如您在一篇评论中所建议的那样。我想这会让你的生活更轻松。

我通过调用相关结果源的适当方法来实现这一点,例如,
$resultset->result\u source->
。即使在活动应用程序中,它也可以工作。

您确定您的用户真的更改了数据库架构吗?这完全等同于允许他们编辑源代码。您不一定需要使用DBIx::Class为“用户界面”建模。您可能希望开发一些中间表示,以提供所需的功能,并保持代码和数据库模式不变。如果您正在跟踪不受控制的不断变化的数据库,还可以使用DBIx::Class::schema::Loader之类的工具。但请记住,数据库模式更改将更改应用程序的行为。如果您的代码是静态的,而数据库模式是动态的,那么几乎可以肯定会有问题。我正在探索在实际数据库上使用我自己的模式/数据字典的可能性。我有一个“columns”表和一个“tables”表。它们用于将用户选择的表、列名和属性映射到底层通用表空间。因此,用户可以选择在运行时添加表之间的关系。我想通过DBIx访问此关系。我正在构建一个中间接口来隐藏通用模式,并且需要这个功能。谢谢,-乔。。。或者我应该使用Catalyst::Model::DBIEN即使在Catalyst中使用DBIC,也可以轻松访问底层DBI对象($c->Model->storage->dbh)。在我们的Catalyst/DBIC应用程序中,我们一直都在这样做(事实上,现在我们这样做的频率可能比直接使用DBIC的频率要高——我对DBIC的大多数事情都很讨厌:)+1表示“当它碍事的时候……”评论。我仍然更喜欢Class::DBI而不是DBIC的原因之一是,我不觉得它会妨碍我。