【问题标题】:CakePHP 3.x single association based on multiple tablesCakePHP 3.x 基于多表的单一关联
【发布时间】:2015-09-16 06:49:52
【问题描述】:

我有一个表“InvoiceRows”属于“产品”(以及更多关联)。目标是拥有一个版本化的数据库,因此“InvoiceRows”有 2 个与“产品”相关的字段:InvoiceRows.product_idInvoiceRows.product_revision

我最初的想法是为“产品”设置 2 个表:Products(当前产品)和products_old(旧版本产品)。这是完美的工作:一旦产品发生变化,旧版本就会被复制到ProductsOld 并且字段Products.revision 会增加。 要进行最终关联,首先将在Products 上执行一个SELECT,如果它什么都不返回,则在ProductsOld 上执行相同的SELECT。


换句话说:

我想完成:InvoiceRowsbelongsTo Products(存在ProductsProductsOld):

  1. 查看Products 获取最新产品,因为它通常是必需的产品
  2. 如果找到,我们就准备好了。如果没有,请查看 ProductsOld 以获取旧版本的产品。
  3. 如果找到了,我们就准备好了。

但是,我似乎无法在 xxxTable.php 文件中正确设置此关联。我想通过仅更改 InvoiceRows->belongsTo(...); 来完成此操作和产品->hasMany(...);功能配置。

这可能吗?

【问题讨论】:

    标签: mysql cakephp associations


    【解决方案1】:

    Cakephp 的关联本质上是 SQL 的 JOIN 子句的包装器。您关于 if not found, then.. 的概念不能很好地(如果全部)转化为 SQL 编程。因此,我认为您不会找到遵循您描述的确切逻辑的解决方案。

    几个替代“解决方案”:

    让你的InvoiceRow 同时属于ProductProductsOld - 但你需要有两个不同的关系。查询数据库时,会同时搜索两个表。您将需要代码来处理这两种情况:

    • 值来自Products,而不是ProductsOld
    • 值来自ProductsOld,而不是Products

    另一种解决方案(这是 Cakephp v2 的功能,不确定 v3),是创建一个 SQL 视图,其中 UNIONProductsProductsOld 以模型为基础该视图并为这些目的使用该关系。

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多