Doctrine 2 Discriminator继承映射导致findBy方法无效

时间:2012-03-02 13:32:59

标签: inheritance doctrine mapping doctrine-orm discriminator

我有2个实体,一个作为主要的超级类,由描述符等组成,另一个扩展这个超级类......所以我可以 将所有操作记录在一个名为Action的表中。

我的discrimator实体:

namespace Entities\Members;

/**
 * @Entity
 * @Table(name="actions")
 * @MappedSuperClass
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="action_type", type="string")
 * @DiscriminatorMap({"comments" = "Comments", "blog" = "Blog"})
 * @HasLifecycleCallbacksIndex
 */
class Action {

    /**
     * @Id 
     * @Column(name="id", type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /** @Column(type="string", length=300, nullable=true) */
    public $name;

    /** @Column(name="action_date", type="datetime", columnDefinition="datetime", nullable=false) */
    protected $action_date;

    /** @PrePersist */
    public function updated() {
        $this->action_date = new \DateTime("now");
    }

}

这是我用来扩展上述描述符实体的实体之一:

namespace Entities\Members;

/**
 * @Entity
 * @Table(name="comments")
 * @HasLifecycleCallbacks
 */
class Comments extends Action {

    /**
     * @Id @Column(name="id", type="bigint",length=15)
     * @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /** @Column(name="blog_id", type="integer", nullable=true) */
    protected $blog_id;

    /** @Column(name="comment", type="string", length=255, nullable=true) */
    protected $comment;

    /** @Column(name="comment_date", type="datetime", columnDefinition="datetime", nullable=true) */
    protected $comment_date;

    /**
     * @ManyToOne(targetEntity="Members",inversedBy="comments", cascade={"persist"})
     * @JoinColumn(name="userid", referencedColumnName="id")
     */
    protected $author;


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

}

当我坚持评论实体时,这很有效,例如

$entity = new Entities\Comments;
$entity->comment = "my new comment";
$this->em->persist($entity);
$this->em->flush();

当我坚持下去时,它会将动作成功添加到动作表中......

然而,我不能再使用任何findBy,findByOne方法,这些方法的任何结果的返回值= null 现在,当我编辑评论类并删除'从动作延伸'时,学说findby,findOneBy方法开始工作 但它不会添加到tmy discriminator表,因为它没有扩展那个主要的Action超类......

我需要它来扩展Actions并使用find,findOneBy等教义方法来工作......

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

请发布您的查询代码。我有兴趣了解这一切是如何工作的,所以我复制了你的实体,然后用:

进行查询
protected function testJoinedQuery()
{
    $em = $this->getEntityManager();
    $repo = $em->getRepository('Entity\Comments');

    $entity = $repo->findOneBy(array('id' => 2));

    echo get_class($entity) . ' ' . $entity->getComment() . "\n";

}

似乎工作得很好。您是否尝试使用Actions repo?

你可能不需要这个:

  • @MappedSuperclass

但拥有它似乎并没有伤害任何东西。