2014-04-21 40 views
2

我已经将我的模型与我的实体分开。我有三个模型与相应的实体:Review,RatedReview和ScoredReview。他们的关系是ScoredReview延伸RatedReview延伸审查。Symfony + Doctrine:模型和继承

所以对我的模型有:

// Project/ReviewBundle/Model/Review.php 

class Review 
{ 
} 

// Project/ReviewBundle/Model/RatedReview.php 

class RatedReview extends Review 
{ 
} 

// Project/ReviewBundle/Model/ScoredReview.php 

class ScoredReview extends RatedReview 
{ 
} 

然后,我通过扩展模型,像这样实现实体:

// Project/ReviewBundle/Entity/Review.php 

use Project\ReviewBundle\Model\Review as BaseReview; 

class Review extends BaseReview 
{ 
} 

// Project/ReviewBundle/Entity/RatedReview.php 

use Project\ReviewBundle\Model\RatedReview as BaseRatedReview; 

class RatedReview extends BaseRatedReview 
{ 
} 

// Project/ReviewBundle/Entity/ScoredReview.php 

use Project\ReviewBundle\Model\ScoredReview as BaseScoredReview; 

class ScoredReview extends BaseScoredReview 
{ 
} 

所以继承的模型侧发生。学说似乎无法看到这一点,并将它们映射到单独的表格。我明白这是因为教义只寻找扩展其他实体的实体,而不是扩展模型的实体。

有没有更好的方式让我将模型与实体分开,同时保留扩展实体的能力?这就是特质派上用场的地方吗?

换言之,有无论如何,我可以有一个由模型组成的树,以及由扩展这些模型的实体组成的树?

+2

你看过主义传承吗? http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html看起来像单表继承是你正在寻找的。 – Cerad

+0

@Cerad我使用单表继承,它通常很棒。这里的问题是单个表继承需要实体直接相互延伸,而不是扩展相互延伸的模型。然而,我希望我的逻辑能够在模型中表达ScoredReviews,而不是在实体中。我通过使用基类的一个模型和子类的特征来解决这个问题。 – JProffitt

回答

1

我已经想出了解决这个问题的方法,它确实涉及特征。

我正在做的是基本上试图创建一个表的几个变种。评论之间的关系比纵向更加横向(一种评论可能有评级,另一种评论是视频,另外两种评论都是)。特质对于水平关系来说显然是完美的,所以我没有为每个变体创建模型,而是创造出特质。

所以现在我的“模式”是这样的:

// Project/ReviewBundle/Entity/Review.php 

use Project\ReviewBundle\Model\Review as BaseReview; 

class Review extends BaseReview 
{ 
} 

// Project/ReviewBundle/Entity/RatedReviewTrait.php 

trait RatedReviewTrait 
{ 
} 

// Project/ReviewBundle/Entity/ScoredReviewTrait.php 

trait ScoredReviewTrait 
{ 
} 

而且我的实体是这样的:

// Project/ReviewBundle/Entity/Review.php 

use Project\ReviewBundle\Model\Review as BaseReview; 

class Review extends BaseReview 
{ 
} 

// Project/ReviewBundle/Entity/RatedReview.php 

use Project\ReviewBundle\Model\RatedReviewTrait; 

class RatedReview extends Review 
{ 
    use RatedReviewTrait; 
} 

// Project/ReviewBundle/Entity/ScoredReview.php 

use Project\ReviewBundle\Model\RatedReviewTrait; 
use Project\ReviewBundle\Model\ScoredReviewTrait; 

class ScoredReview extends Review 
{ 
    use RatedReviewTrait; 
    use ScoredReviewTrait; 
} 

我的模型远离我的实体分离,并作为奖金我解耦变化从彼此 - 非常棒。我看到的唯一问题是这需要PHP> = 5.4。

+0

如果问题解决了,您可以接受自己的答案。 –

+0

@ n.1谢谢,我不得不等待48小时,忘了回来。 – JProffitt