简体   繁体   English

准则2中的可选ManyToOne关系

[英]Optional ManyToOne relationship in Doctrine 2

I'm building an application for SNMP Trap logging. 我正在构建用于SNMP陷阱日志记录的应用程序。 It has two MySQL tables: one with the traps, and one with the hosts that I want to log. 它有两个MySQL表:一个带有陷阱,一个带有我要记录的主机。

The traps table is filled externally. 陷阱表在外部填充。 The hosts can be entered through the website. 主机可以通过网站输入。 A host CAN have one or many traps. 主机可以有一个或多个陷阱。 A trap CAN have one host. 一个陷阱可以有一个主机。

So this is a many to one relationship, but optional on both sides. 因此,这是多对一的关系,但双方都是可选的。 How do I implement this, since Doctrine requires for one of the members to be a primary key, and therefore not nullable? 由于Doctrine要求成员之一是主键,因此不能为空,因此我应如何实现呢?

Code for both classes: 这两个类的代码:

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;
}

Edited with error The error is that I'm not allowed to delete or truncate my hosts table, which should be possible in my application, because traps must be able to exist without a host. 错误进行编辑该错误是我不允许删除或截断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`))

Posted as answer from comment as believe to be appropriate answer; 从评论中作为答案发布,认为是适当的答案;

"If you are trying to remove this as straight sequel then yes the error is correct you cannot remove the parent before unlink the child, if there is no parent then this is fine if so unlink first then remove" “如果您尝试将其作为直接续集删除,那么是的,该错误是正确的,您无法在取消链接孩子之前删除父项,如果没有父项,那么先取消链接然后删除就可以了”

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

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