Doctrine 2中的可选ManyToOne关系

时间:2014-09-29 09:17:22

标签: php mysql symfony doctrine-orm doctrine

我正在构建SNMP Trap日志记录的应用程序。它有两个MySQL表:一个带有陷阱,另一个带有我要记录的主机。

陷阱表在外部填充。主机可以通过网站输入。主机CAN有一个或多个陷阱。陷阱CAN有一个主机。

所以这是多对一的关系,但双方都是可选的。我如何实现这一点,因为Doctrine要求其中一个成员成为主键,因此不可为空?

两个类的代码:

class Trap
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="eventname", type="string", length=50)
     */
    private $eventname;

    /**
     * @var string
     *
     * @ORM\Column(name="eventid", type="string", length=50)
     */
    private $eventid;

    /**
     * @var string
     *
     * @ORM\Column(name="trapoid", type="string", length=100)
     */
    private $trapoid;

    /**
     * @var string
     *
     * @ORM\Column(name="enterprise", type="string", length=100)
     */
    private $enterprise;

    /**
     * @var string
     *
     * @ORM\Column(name="community", type="string", length=20)
     */
    private $community;

    /**
     * @var string
     *
     * @ORM\Column(name="hostname", type="string", length=255)
     */
    private $hostname;

    /**
     * @var string
     *
     * @ORM\Column(name="agentip", type="string", length=16)
     */
    private $agentip;

    /**
     * @var string
     *
     * @ORM\Column(name="category", type="string", length=20)
     */
    private $category;

    /**
     * @var string
     *
     * @ORM\Column(name="severity", type="string", length=255)
     */
    private $severity;

    /**
     * @var string
     *
     * @ORM\Column(name="uptime", type="string", length=20)
     */
    private $uptime;

    /**
     * @var datetime
     *
     * @ORM\Column(name="traptime", type="datetime")
     */
    private $traptime;

    /**
     * @var string
     *
     * @ORM\Column(name="formatline", type="string", length=255)
     */
    private $formatline;    

    /**
     * @ORM\ManyToOne(targetEntity="Host", inversedBy="traps")
     * @ORM\JoinColumn(name="agentip", referencedColumnName="ip", nullable=true)
     */
    protected $host;
}
class Host
{
    /**
     * @var string
     * @ORM\Id
     * @ORM\Column(name="ip", type="string", length=16)
     */
    private $ip;

    /**
     * @ORM\Column(name="hostname", type="string", length=100)
     */
    private $hostname;

    /**
     * @ORM\Column(name="type", type="string", length=100)
     */
    private $type;

    /**
     * @ORM\Column(name="importance", type="integer", length=1)
     */
    private $importance;

    /**
     * @ORM\OneToMany(targetEntity="Trap", mappedBy="host")
     */
    protected $traps;
}

编辑错误 错误是我不允许删除或截断我的hosts表,这应该可以在我的应用程序中使用,因为陷阱必须能够在没有主机的情况下存在。

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`snmptt`.`snmptt`, CONSTRAINT `FK_9BF059B998B5BE9E` FOREIGN KEY (`agentip`) REFERENCES `hosts` (`ip`))

1 个答案:

答案 0 :(得分:0)

发表评论的答案,认为是适当的答案;

"如果你试图删除这个直接续集然后是错误是正确的你不能在取消链接孩子之前删除父母,如果没有父母那么这是好的如果首先取消链接然后删除&#34

相关问题