Php 条令和继承映射:子实体上的关联

Php 条令和继承映射:子实体上的关联,php,doctrine-orm,Php,Doctrine Orm,我试图查询一个实体并加入另一个实体,该实体是继承映射结构中的子实体 情况是: 我有一个母实体(如动物) 我有一个孩子实体(如狗) 我有一个与孩子有1:1关联的实体(狗屋) 我想询问所有的狗屋和教义,让我也知道它们的主人 我编写的简单DQL查询是: SELECT o FROM MyBundle:DogHouse h JOIN h.dog d 错误是: 注意:中未定义的索引:id ../vendor/doctor/lib/doctor/ORM/Query/SqlWalker.php 第779行

我试图查询一个实体并加入另一个实体,该实体是继承映射结构中的子实体

情况是:

  • 我有一个母实体(如动物)
  • 我有一个孩子实体(如狗)
  • 我有一个与孩子有1:1关联的实体(狗屋)
我想询问所有的狗屋和教义,让我也知道它们的主人

我编写的简单DQL查询是:

SELECT o FROM MyBundle:DogHouse h JOIN h.dog d
错误是:

注意:中未定义的索引:id ../vendor/doctor/lib/doctor/ORM/Query/SqlWalker.php 第779行,类别:ErrorException

从堆栈跟踪来看,doctrine似乎试图与子实体上的id而不是父实体上的id连接

下面是说明这种情况的课程

/**
 *  Animal
 *
 * @ORM\Entity
 * @ORM\Table(name="animal")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="integer")
 * @ORM\DiscriminatorMap({"1"="cat",  "2"="dog"})
 */
class Animal
{
    /**
     * @ORM\Column(name="animal_id", type="integer", nullable=false)
     * @ORM\Id
     */
    protected $id;

    /**
     * @ORM\Column(name="name", type="string", length=200, nullable=false)
     */
    protected $name;

    /* getters, setters... */
}

/**
 * Dog
 *
 * @ORM\Entity
 * @ORM\Table(name="dog")
 */
class Dog extends Animal
{
    /**
     * @ORM\OneToOne(targetEntity="DogHouse", inversedBy="dog")
     */
    private $dogHouse;

    /* getters, setters... */
}


/**
 * Dog House
 * 
 * @ORM\Table(name="dog_house")
 * @ORM\Entity
 */
class DogHouse
{
    /**
     * @ORM\Column(name="dog_house_id", type="integer", nullable=false)
     * @ORM\Id
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="Dog", mappedBy="doghouse")
     */
    private $dog;

    /* getters, setters... */
}
注:
与完全相同的问题相关,但未得到回答

您的映射设置不正确

狗/狗屋之间的一对一关系应如下所示

class DogHouse....

 /**
 * @ORM\OneToOne(targetEntity="Dog", mappedBy="doghouse")
 */
private $dog;

确保你的mappedBy=“doghouse”

你是对的,我在写那个例子时打错了。我将编辑原始帖子以更正它。但不幸的是,这个问题仍然存在。谢谢你的回答。我从头开始就发现了。未定义的index:id消息引用了JoinColumn的referencedColumnName属性。Simpley我的错了。我找得太远了,其实很简单。无论如何谢谢你的帮助如果这个答案不是你问题的正确答案,为什么不自己创建一个新的答案,然后选择这个答案呢?