【问题标题】:Doctrine and inheritance mapping: association on a child entity教义和继承映射:子实体上的关联
【发布时间】:2012-06-19 13:07:06
【问题描述】:

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

情况是:

  • 我有一个父实体(例如动物)
  • 我有一个子实体(例如 Dog)
  • 我有一个与孩子 1:1 关联的实体(狗屋)

我想查询所有的狗屋和教义,让我也找到他们的狗主人。

我写的简单 DQL 查询是:

SELECT o FROM MyBundle:DogHouse h JOIN h.dog d

错误是:

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

查看堆栈跟踪,似乎学说试图与子实体而不是父实体上的 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... */
}

注意: This post 涉及完全相同的问题,但没有得到回答

【问题讨论】:

    标签: php doctrine-orm


    【解决方案1】:

    您的映射设置不正确...

    Dog / Doghouse 之间的一对一关系应该如下..

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

    确保您的 mappedBy="doghouse"

    【讨论】:

    • 你是对的,我在写那个例子时打错了。我将编辑原始帖子以更正它。但不幸的是,问题仍然存在。感谢您的回答
    • 好吧,我从头开始找到了。 Undefined index: id 消息引用了 JoinColumn 的 referencedColumnName 属性。我的 Simpley 错了。我搜索得太远了,实际上很简单。无论如何感谢您的帮助
    • 如果此答案实际上不是您问题的正确答案,为什么不自己创建一个新答案,然后选择该答案?
    猜你喜欢
    • 2015-06-30
    • 2011-07-25
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多