CakePHP替代类表继承?

时间:2011-04-29 14:07:22

标签: mysql cakephp cakephp-1.3 cakephp-appmodel class-table-inheritance

我想在CakePHP中创建一个Class Table Inheritance模型。

我希望有一个名为ProductBase的模型,其中包含表product_bases,以保存每个产品应具有的所有基本信息,例如upc,price等。

然后有特定的产品类型模型扩展。例如ProductRing与表product_rings一起保存特定的铃声信息,如ring_size,center_stone等。

然后,如果我直接从ProductBase模型中检索数据,请将其拉​​为所有类型:

// pull all product types
$this->ProductBase->find('all'); 

或仅查找特定类型:

// pull only Rings or descendants of the Ring type.
$this->ProductRing->find('all'); 

在CakePHP中是否可以这样?如果没有,我应该做什么呢?

做这样的事情的 Cake方式是什么?

2 个答案:

答案 0 :(得分:1)

您指的是ARC relationship(或至少是其中的一种变体)。 Cake不会动态处理这些类型的关系。这意味着您必须实现自己的逻辑来处理这个问题。

另一种选择是对产品进行分类。如果产品可以分为多个类别,那么您将需要每个产品的HABTM类别。否则,您可以使用类别列。我怀疑它将是你正在寻找的HABTM。

  • 产品:包含该表格的表格 产品
  • 类别:类别列表 任何特定产品都属于。
  • CATEGORIES_PRODUCTS:之间的链接 每种产品及其各种 类别。
  • TYPE:这是将要的标志 定义产品的类型(即 戒指,鞋子,裤子等。)

然后,当您想要所有产品时,您可以查询产品表。当您想要一片产品(即戒指)时,您可以选择属于RING类别的所有产品。

现在,我们需要解决有关产品的信息。例如,并非所有信息都适用于每个产品。有很多方法可以做到这一点。

  1. 您可以构建多个表 持有产品信息。什么时候 你拉一个给定类型的产品, 你拉它的伴侣信息 从表中。
  2. 将信息存储在文本中 字段作为序列化数据。全部 信息可以在a中定义 设置var然后你可以使用 要映射到的序列化数据 信息。
  3. 我希望这会有所帮助。快乐的编码!

答案 1 :(得分:1)

我和CakePHP合作了两年,并没有找到令人满意的解决方案,所以有一天我为它写了一个解决方案。我在CakePHP 2.x上构建了一种新的ORM作为插件。我称它为“奶油”。

它类似于CakePHP 3.0的实体,但另外支持多表继承。它还支持非常方便的数据结构浏览(延迟加载),并且非常易于配置。在我看来,它比CakePHP 3.0现在提供的功能更强大。数据结构浏览的工作原理如下:

$entity = new Entity('SomeModel', $somePrimaryKeyValue);
$foo = $entity->RelatedModel()->YetAnotherRelatedModel()->someProperty(); 

但是,重要的是要注意,在Cream中,每个实体对象都是一系列模型和主键值的合并,这些模型和主键值合并在一起。至少在使用模型继承的情况下。这样的化合物看起来像:

[<'SomeConcreteModel', primaryKeyValueA>, <'IntermediaryModel', primaryKeyValueB>, <'BaseModel', primaryKeyValueC>]

重要的是要注意,您可以通过任何给定的model / primaryKeyValue组合来获取此实体。它们都指的是同一个实体。

使用此功能,您也可以解决问题。您可以使用标准的CakePHP查找方法从基本模型中查找所需的所有主键值,也可以使用从其继承的查找方法模型,然后继续创建实体。

只需在模型类中编写,即可设置继承/扩展链:

public $extends = 'YourBaseModel';

此外,您还需要在模型(hasOne或belongsTo)之间设置普通的CakePHP关系。它就像普通的OOP一样,有一系列从它们的基础继承的模型。如果您只使用vanilla CakePHP,您会发现这些模型是相关的,但是当您开始使用Cream界面时,所有实体都会将model / primaryKeyValue对合并到一个对象中。

在我的github存储库中,有一个powerpoint文件可以解释大多数基本功能。

https://github.com/erobwen/Cream

也许我应该派出CakePHP项目并发出拉取请求,但是现在它是一个单独的存储库。请随时评论或参与开发“奶油”。

另外,对于那些建议最好“按照预期使用CakePHP流程”的人,我会争论如下。常见的估计表明,C程序比C ++程序大2.5倍。鉴于分离这些语言的唯一特性是具有继承的OOP等,我们可以推断出缺少具有继承等的适当OOP需要程序员使用重复代码等进行150%的额外工作。因此我认为适当的模型非常需要CakePHP中的继承机制。奶油是一种尝试。