我一直在对这个主题进行一些研究,但到目前为止,我找不到任何对我的场景有帮助的东西。
简而言之:我有两个表Quote
(表名:quote)和QuoteArchive
(表名为:quote_archive)。两者共享完全相同的列和类型。据我所知,这个转变成了一个条令映射的超级类,例如:MappedSuperclassQuote
。
之后,Quote
和QuoteArchive
实体将从MappedSuperclassQuote
扩展,并且两者将共享完全相同的结构。
Quote
有一个带有一些功能的自定义存储库。QuoteArchive
需要与Quote
完全相同的Repository函数,唯一的区别是表名和PK。
在这种情况下,我有两个疑虑:
- 当PK(@Id)在子类中不同时,如何扩展条令实体
- 当只更改表名时,如何在实体之间扩展或共享同一存储库
为了更好地了解我当前的实体是什么样子的:
/**
* @ORMEntity
* @ORMTable(name="quote")
* @ORMEntity(repositoryClass="QuoteBundleEntityRepositoryQuoteRepository")
*/
class Quote
{
/**
* @ORMId
* @ORMColumn(type="integer",unique=true,nullable=false)
* @ORMGeneratedValue
*/
private $quoteId;
// ...
}
/**
* @ORMEntity
* @ORMTable(name="quote_archive")
* @ORMEntity(repositoryClass="QuoteBundleEntityRepositoryQuoteArchiveRepository")
*/
class QuoteArchive
{
/**
* @ORMId
* @ORMColumn(type="integer",unique=true,nullable=false)
*/
private $archiveId;
// ...
}
最后但同样重要的是:
class QuoteRepository extends EntityRepository
{
public function getCurrentQuoteId(int $OrigQuoteId)
{
$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();
return $qb->select('q')
->from('QuoteBundle:Quote')
->where('q.origQuoteId =:origQuoteId')
->setParameter('origQuoteId', $OrigQuoteId)
->andWhere('q.quoteType =:quoteType')
->setParameter('quoteType', 'current')
->getQuery()
->getResult();
}
}
这里有什么问题?我需要在QuoteArchiveRepository
中重复同样的函数,并将表从quote
更改为quote_archive
,如果可能的话,这正是我试图避免的。
有人能给我一些主意吗?代码示例会很棒:)
参考文献:
- 我们能扩展条令中的实体吗
- 原则:扩展实体类
- 条令如何扩展自定义存储库并从条令实体管理器调用扩展存储库
我认为您做MappedSuperclassQuote实体是错误的。您必须从报价中继承Archive。
示例:您有自己的报价实体定义应该类似于:
/**
* @ORMTable(name="app_quote")
* @ORMInheritanceType("JOINED")
* @ORMDiscriminatorColumn(name="quote_type", fieldName="quoteType", type="string")
* @ORMDiscriminatorMap({
* "quote":"YourBundleEntityQuote",
* "quote_archive":"YourBundleEntityQuoteArchive"
* })
* @GedmoLoggable
* @ORMEntity(repositoryClass="YourBundleRepositoryQuoteRepository")
*/
为什么是JOINED继承?因为你想要两个独立的表(SINGLE_TABLE没有做什么),并且你没有一个真正抽象的类(因为Quote and QuoteArchive对你来说意义重大)
之后,您的表QuoteArchive应该扩展第一个:
/**
* @ORMEntity
* @ORMTable(name="app_quote_archive")
*/
class QuoteArchive extends Quote
{
...
}
app_quote中的quote_type列将帮助您了解这是否是存档的报价。
它为您提供了所需的一切:-QuoteArchive将可以访问QuoteRepository中的功能-每个表都有独立的ID
有一件事可能会让你很烦恼:如果你想设置一个报价已经存档,那么现在在Doctrine中更改实体类型就不那么容易了。在这种情况下,最好使用single_table联接类型。所有数据都存储在数据库中的同一个表中,这使得类型更改很容易,但您保留了两个不同的实体。