Doctrine 条件联想学说

Doctrine 条件联想学说,doctrine,doctrine-orm,one-to-many,relation,Doctrine,Doctrine Orm,One To Many,Relation,我正在建立一个问答网站,我的问题、答案和评论都在同一张帖子上。但是他们的postType是不同的。我可以通过该协会获得问题的答案和答案的评论: /** * @OneToMany(targetEntity="Cms\Entity\Post", mappedBy="parent") */ private $answers; /** * @OneToMany(targetEntity="Cms\Entity\Post", mappedBy="parent") */ private $comm

我正在建立一个问答网站,我的问题、答案和评论都在同一张
帖子上。但是他们的
postType
是不同的。我可以通过该协会获得问题的答案和答案的评论:

/**
 * @OneToMany(targetEntity="Cms\Entity\Post", mappedBy="parent")
 */
private $answers;

/**
 * @OneToMany(targetEntity="Cms\Entity\Post", mappedBy="parent")
 */
private $comments;
但我认为这不是正确的方法,因为如果我提出一个问题,答案和评论都充满了正确的答案。我必须为关系设置一个条件,如
postType=1


如何执行此操作?

您的架构无效。答案和注释可以有两个不同的对象,因为它们是两个不同的东西,即使它们共享一个公共接口

您应该创建两个实体,
Answer
Comment
,并为它们创建关联。因为它们几乎是相同的东西,所以您可以创建一个抽象类,
AbstractContent
,它定义所有必需的字段和访问器方法。条令支持继承,因此最终的数据库模式将完全相同,但您的OO模型将是正确的

/** 
 * @MappedSuperclass 
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(type = "string", name = "discriminator")
 * @DiscriminatorMap({ "answer" = "Answer", "comment" = "Comment" })
 */
abstract class AbstractContent {
    /** @Column(type = "integer") @Id @GeneratedValue("AUTO") */
    protected $id;

    /** @Column(type="text") */
    protected $content;

    /** @Column(type = "datetime", name = "created_at") */
    protected $createdAt;

    public function __construct() {
        $this->createdAt = new \DateTime();
    }
}

/** @Entity */
class Answer extends AbstractContent { }

/** @Entity */
class Comment extends AbstractContent { }

您可以在其文档页面上阅读更多关于继承原则的信息:

使用原则。甚至可以在sql查询之前先筛选集合:

如果尚未从数据库加载集合,则 过滤API可以在SQL级别工作,以优化对 大量收藏


您的超类中缺少“@Entity”或“@ORM\Entity”注释。除此之外,答案是好的。@Siwei
AbstractContent
本身不是一个实体,所以不应该有
@entity
注释。请看;-)中的示例也许这是一个条令版本问题,但在最新的条令2 ORM(直到今天2014年12月20日)中,
@Entity
标记需要包含在超类中,否则它将报告错误“不支持在映射的超类上定义继承信息”。
/**
 * @OneToMany(targetEntity="Cms\Entity\Answer", mappedBy="parent")
 */
private $answers;

/**
 * @OneToMany(targetEntity="Cms\Entity\Comment", mappedBy="parent")
 */
private $comments;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;

...

    /** @var Collection */
    protected $posts;

    /**
     * @return Post[]
     */
    public function getAnswers()
    {
        $criteria = Criteria::create()
            ->where(Criteria::expr()->eq('postType', 'answer'))
        ;

        return $this->posts->matching($criteria);
    }

    /**
     * @return Post[]
     */
    public function getComments()
    {
        $criteria = Criteria::create()
            ->where(Criteria::expr()->eq('postType', 'comment'))
        ;

        return $this->posts->matching($criteria);
    }