我遇到了一个问题,它也可能放在programmers.stackexchange.com 上,但是由于它与Doctrine 和ZF2 非常相关,所以我选择把它放在这里。让我向您介绍我的场景:
- 我有一个用户发布实体(
BaseEntity
)的应用程序。 BaseEntity
有财产_$cagetory
- 然而,取决于
$category
实体必须有额外的属性
Ab 简单示例:
class BaseEntity {
protected $id;
protected $title;
protected $description;
}
class MovieEntity {
protected $id;
protected $title;
protected $description;
protected $airingDateStart; // new property
protected $airingDateEnd; // new property
}
现在我可以轻松地做一个两步公式,其中用户首先选择他的类别并根据将选择实体类 - 但我不能这样做。但这并不好,因为如果用户在BaseEntity
-Category 中放置了电影,然后想将实体更改为 ,该MovieEntity
怎么办?所以这个想法并不是一个安全的选择。
附加要求(使事情更复杂)
- 类别和实体必须由 Doctrine 控制
- 每个
Category
都通过单个提供给应用程序Module
- 模块需要放置到应用程序中,不需要太多配置(最多一个 DB-Query 来填充
CategoryTable
)
到目前为止我做了什么
起初我选择使用 Doctrines 功能Single Table Inheritance运行。这使我能够轻松地完成诸如MovieEntity extends BaseEntity
向数据库添加新实体的魅力之类的事情。但主要问题仍然存在:如果用户更改类别怎么办,它会更改实体类,这几乎是不行的。
我的意思是,我可以按目前的方式做事,并在更改类别时手动修改,DiscriminatorColumn
但这太脏了。
另一种替代方法是,在更改类别时,将创建一个新实体并销毁旧实体,但这也有点脏。
总而言之,我认为我走错了方向。可能有一个我不知道的开发模式,这让我所有的努力看起来都像是一种浪费,最终事情变得超级容易,但似乎我忽略了一些东西。
为了更深入地了解我的目标,您可以查看我在 GitHub 上的应用程序:
- DuitMarketplace - 这是具有基本类别的主要应用程序,所有控制器等......这
ItemController#editAction()
可能会提供更多关于我打算如何自动制作一些东西的线索。 - DuitMarketplaceItemVehicle - 一个被放入主应用程序的类别
提前感谢我可能得到的所有反馈。我完全意识到这个问题可能介于 SO 与programmers.stackexchange 之间的存在之间,但我毕竟选择了它。