Doctrine 2映射2个表,错误

时间:2017-11-30 13:14:03

标签: php mysql doctrine-orm zend-framework3 doctrine-mapping

Zend Framework 3,Doctrine 2.我创建了2个表MySQL

的映射
/**
* @ORM\Entity
* @ORM\Table(name="object")
*/
class Object 
{
    /**
    * @ORM\Id
    * @ORM\GeneratedValue
    * @ORM\Column(name="id")
    */
    protected $id;

   /**
    * @ORM\OneToOne(targetEntity="..\Host", inversedBy="object")
    * @ORM\JoinColumn(name="ip", referencedColumnName="IP")
    */
   protected $host;

}

/**
 * @ORM\Entity
 * @ORM\Table(name="host")
 */
class Host 
{
    /**
     * @ORM\Id
     * @ORM\Column(name="IP")
    */
    protected $ip;


    /**
     * @ORM\OneToOne(targetEntity="..\Object", mappedBy="host")
     * @ORM\JoinColumn(name="IP", referencedColumnName="ip")
     */
    protected $object;
}

我有这个错误:

  

错误"在.. \ Object"。

上缺少主键ID的值

为什么呢?它似乎是根据例子完成的 - > 5.3。来自网站Doctrine的一对一,双向

1 个答案:

答案 0 :(得分:0)

传递给JoinColumn的参数不正确。您可以查看JoinColumn here的文档。

试试这样:

// For Object class: 
// @ORM\JoinColumn(name="host_ip", referencedColumnName="ip")

// For Host class
// @ORM\JoinColumn(name="object_id", referencedColumnName="id")

除此之外:OneToOne注释不支持mappedBy。您可以使用targetEntity和inversedBy但不能使用mappedBy。

另一方面,将ip作为主键似乎是错误的。您应该为Host创建一个自动生成的主ID,并使用它来连接实体。您仍然可以将ip字段设置为唯一,因此您不会重复。另外,你没有任何其他领域,你甚至可以把ip放在Object类中。

另外,我不建议使用Object作为您的班级名称。这太笼统了。