如何扩展条令2中的存储库?用于在不同的表名中共享通用功能



我一直在对这个主题进行一些研究,但到目前为止,我找不到任何对我的场景有帮助的东西。

简而言之:我有两个表Quote(表名:quote)和QuoteArchive(表名为:quote_archive)。两者共享完全相同的列和类型。据我所知,这个转变成了一个条令映射的超级类,例如:MappedSuperclassQuote

之后,QuoteQuoteArchive实体将从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联接类型。所有数据都存储在数据库中的同一个表中,这使得类型更改很容易,但您保留了两个不同的实体。

相关内容

  • 没有找到相关文章

最新更新