php - 交响乐 + 学说 : Models and Inheritance

标签 php symfony doctrine-orm models entities

我已将模型与实体分开。我有三个具有相应实体的模型:Review、RatedReview 和 ScoredReview。他们的关系是 ScoredReview 扩展 RatedReview 扩展 Review。

所以对于我的模型,我有:

// 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
{
}

所以继承发生在模型端。 Doctrine 似乎看不到这一点,并将它们映射到单独的表中。我理解这是因为 Doctrine 只查找扩展其他实体的实体,而不是扩展模型的实体。

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

换句话说,我是否可以拥有一棵由模型组成的树,以及一棵由扩展这些模型的实体组成的树?

最佳答案

我已经针对这个问题提出了一个解决方案,它确实涉及到特征。

我正在做的基本上是尝试创建表格的几种变体。评论之间的关系更多是水平关系而不是垂直关系(一种类型的评论可能有评级,另一种类型是视频,另一种类型两者都有)。特征显然非常适合横向关系,因此我没有为每个变体创建模型,而是创建特征。

现在我的“模型”看起来像这样:

// 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。

关于php - 交响乐 + 学说 : Models and Inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23200843/

相关文章:

php - 用星号替换整个字符串

php - Symfony 2 功能测试 : authenticate user of own User class

Symfony2 : deleted property still used in query

php - 教义和复合唯一键

php - 如何在 Bisna 中正确加载 DoctrineExtensions?

php - 长轮询/HTTP流一般问题

php - 为什么用php创建的excel文件与浏览器中的表格不一样?

php - 在 php 中解析子域的字符串

php - 如何访问由变量确定的 Twig 成员?

php - StreamedResponse 是如何工作的?