我用 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 中的继承机制是非常需要的。奶油是一个尝试。