3

我想在 CakePHP中创建一个类表继承模型。

我希望有一个类似于ProductBase表格的模型product_bases来保存每个产品应具有的所有基本信息,例如 upc、价格等。

然后让特定的产品类型模型扩展它。例如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 中有这样的可能吗?如果没有,我应该怎么做?

做这样的事情的正确蛋糕方式是什么?

4

2 回答 2

1

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

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

  • PRODUCTS:存放产品的表。
  • 类别:任何给定产品可以属于的类别列表。
  • CATEGORIES_PRODUCTS:每个产品及其各个类别之间的链接。
  • TYPE:这是定义产品类型(即戒指、鞋子、裤子等)的标志

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

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

  1. 您可以构建多个表来保存产品信息。当您提取给定类型的产品时,您会从表中提取其伴随信息。
  2. 将信息作为序列化数据存储在文本字段中。所有信息都可以在设置变量中定义,然后您可以使用序列化数据映射到信息。

我希望这有帮助。快乐编码!

于 2011-04-29T14:58:36.693 回答
1

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

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

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

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

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

请务必注意,您可以通过任何给定的模型/primaryKeyValue 组合来选择此实体。它们都指的是同一个实体。

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

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

public $extends = 'YourBaseModel';

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

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

https://github.com/erobwen/Cream

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

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

于 2015-08-10T07:30:48.110 回答