ColdFusion:具有多个外键的 ORM 集合

Posted

技术标签:

【中文标题】ColdFusion:具有多个外键的 ORM 集合【英文标题】:ColdFusion: ORM Collection with Multiple Foreign Keys 【发布时间】:2015-06-06 08:14:45 【问题描述】:

我的数据库结构主要由每个表的多个主键组成,因此每个连接都需要多个列。我正在尝试使用 ColdFusion(具体为 11)ORM collection property。 fkColumn 属性中的逗号分隔的列列表似乎不起作用,就像 relationship properties 一样。我有filed a bug with Adobe,但我想知道是否有其他人遇到过这个问题并找到了解决方法。或者也许我只是做错了..

表格设置

Years        Staff         StaffSites    Sites
===========  ============  ============  ===========
YearID (PK)  StaffID (PK)  YearID (PK)   SiteID (PK)
YearName     StaffName     StaffID (PK)  SiteName
                           SiteID (PK)

员工 ORM CFC

component persistent=true table='Staff' 
    property name='id'    column='StaffID'       fieldType='id';
    property name='year'  column='YearID'        fieldType='id';
    property name='sites' elementColumn='SiteID' fieldType='collection' table='StaffSites' fkColumn='StaffID,YearID';

问题

运行生成的查询时出现错误:[Macromedia][SQLServer JDBC Driver][SQLServer]An expression of non-boolean type specified in a context where a condition is expected, near ','.

查看生成的查询,似乎没有为where 子句正确解析列列表,但它有点理解select 表达式中有多个列。

select
    sites0_.StaffID,
    YearID as StaffID1_2_0_,
    sites0_.SiteID as SiteID4_0_ 
from
    StaffSites sites0_ 
where
    sites0_.StaffID,YearID=?

目标

为 ORM 集合属性正确支持多键“连接”。为什么不使用关系?我想使用 ORM 对象然后序列化为 JSON 以在 REST 服务中使用。序列化的 JSON 需要包含关系的 ID,而不是实际的关系数据。例如,JSON 有效负载应该是:


    "id": 1234,
    "year": 2015,
    "sites": [1,2,3]

而不是类似的东西:


    "id": 1234,
    "year": 2015,
    "sites": [
        "id": 1, "name": "Foo",
        "id": 2, "name": "Bar",
        "id": 3, "name": "Baz",
    ]

【问题讨论】:

发布一个预期的 JSON 样本以用于 REST 服务。 @Henry 我已经添加了您要求的示例。感谢您的任何意见。我一直在考虑使用 ORM 挂钩手动获取“加载后”数据。一旦我回到这个项目,我会试试的。 看起来您想要来自 Staff 实体的这个 JSON。对Staff 使用自定义序列化程序(CF11 中的新功能)并将其余部分设置为一对多或多对多与链接表。 【参考方案1】:

对于您的数据库结构,转换为 ORM 的最简单方法是使用“StaffSites”作为 linktable 进行多对多关系。

你应该试试 CF11 的自定义序列化器http://blogs.coldfusion.com/post.cfm/language-enhancements-in-coldfusion-splendor-improved-json-serialization-2

【讨论】:

关系的问题是实际的关系数据包含在序列化的JSON中。我只需要在序列化的时候获取相关的ID,这才是collection的原因。 @Panman 那么为什么要使用 ORM 呢? :) 如果您喜欢处理 ID,只需使用旧的 cfquery。 我还想使用其他 ORM 功能;搜索、缓存等。这是组织其他业务逻辑的好方法。 好的,我试试自定义序列化路由的关系。我无法弄清楚如何配置该属性。你知道我的sites 属性需要是什么吗?

以上是关于ColdFusion:具有多个外键的 ORM 集合的主要内容,如果未能解决你的问题,请参考以下文章

引用具有多个外键的两列主键

同一列上具有多个外键的实体框架核心

Sql Server:创建具有多个外键的表

使用 CodeIgniter 框架将数据插入到具有外键的多个表中

postgresql:具有外键的多个多列索引?

Django 和具有多个外键的模型