我想在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方式是什么?
答案 0 :(得分:1)
您指的是ARC relationship(或至少是其中的一种变体)。 Cake不会动态处理这些类型的关系。这意味着您必须实现自己的逻辑来处理这个问题。
另一种选择是对产品进行分类。如果产品可以分为多个类别,那么您将需要每个产品的HABTM类别。否则,您可以使用类别列。我怀疑它将是你正在寻找的HABTM。
然后,当您想要所有产品时,您可以查询产品表。当您想要一片产品(即戒指)时,您可以选择属于RING类别的所有产品。
现在,我们需要解决有关产品的信息。例如,并非所有信息都适用于每个产品。有很多方法可以做到这一点。
我希望这会有所帮助。快乐的编码!
答案 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中的继承机制。奶油是一种尝试。