繁体   English   中英

准则2中的可选ManyToOne关系

[英]Optional ManyToOne relationship in Doctrine 2

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

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

因此,这是多对一的关系,但双方都是可选的。 由于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`))

从评论中作为答案发布,认为是适当的答案;

“如果您尝试将其作为直接续集删除,那么是的,该错误是正确的,您无法在取消链接孩子之前删除父项,如果没有父项,那么先取消链接然后删除就可以了”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM