我与CakePHP工作了两年,并没有找到满意的解决方案,所以有一天我为它写了一个解决方案。我构建了一种新的ORM,作为CakePHP 2.x之上的一个插件。我称之为“奶油”。
它与CakePHP 3.0的实体类似,但是除此之外还支持多表继承。它还支持非常方便的数据结构浏览(延迟加载)并且非常易于配置。在我看来,它比CakePHP 3.0现在提供的功能更强大。数据结构的浏览的工作原理如下:
$entity = new Entity('SomeModel', $somePrimaryKeyValue);
$foo = $entity->RelatedModel()->YetAnotherRelatedModel()->someProperty();
然而,注意到这一点很重要,即在霜,每一个实体对象是一系列的模型和主键的值是合并在一起的复方。至少在使用模型继承的情况下。这种化合物的样子:
[<'SomeConcreteModel', primaryKeyValueA>, <'IntermediaryModel', primaryKeyValueB>, <'BaseModel', primaryKeyValueC>]
注意到,您可以通过任何给定的模型/ primaryKeyValue组合捡起这个实体是非常重要的。他们都指的是同一个实体。
使用这个,你也可以解决你的问题。您可以使用标准的CakePHP查找方法从基础模型中查找所需的所有主键值,也可以使用从其继承的查找方法模型,然后继续并创建实体。
您设置继承/扩展的链条在模型类简单地写:
public $extends = 'YourBaseModel';
另外,你还需要建立模型之间(hasOne或属于关联)一个普通的CakePHP的关系。它的工作原理与普通的OOP一样,具有从其基础继承的一系列模型。如果你只使用vanilla CakePHP,你会注意到这些模型是相关的,但是当你开始使用Cream界面时,所有实体都将model/primaryKeyValue对合并成一个单独的对象。
在我的github存储库中有一个powerpoint文件,可以解释大部分基本功能。
https://github.com/erobwen/Cream
也许我应该用叉子叉CakePHP的项目,并拉入请求,但现在它是一个独立的存储设备。请随时评论或参与开发“奶油”。另外,对于那些暗示最好只是“按照预期的方式使用CakePHP流程”的人,我会争论以下几点。通常的估计表明C程序比C++程序大2.5倍。鉴于分离这些语言的唯一特征是具有继承等的OOP,我们可以推断出缺少适当的OOP和继承等,需要程序员用重复代码等做150%的额外工作。因此,我会争辩说,一个合适的模型CakePHP中的继承机制非常需要。霜是对此的尝试。