2014-09-29 65 views
2

我正在構建SNMP陷阱日誌記錄的應用程序。它有兩個MySQL表格:一個帶有陷阱,另一個帶有我想記錄的主機。Doctrine 2中的可選ManyToOne關係

陷阱表填充在外部。主持人可以通過網站進入。主機可以有一個或多個陷阱。一個陷阱可以有一臺主機。

所以這是一個多對一的關係,但雙方都是可選的。我如何實現這一點,因爲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`)) 
+0

你的多對一關係對我來說看起來不錯你提出了什麼錯誤? – 2014-09-29 09:24:03

+0

錯誤是我不允許刪除或截斷我的主機表,這應該可以在我的應用程序中使用,因爲陷阱必須能夠在沒有主機的情況下存在。 – 2014-09-29 09:28:44

+0

如果你試圖刪除這個直接續集然後是錯誤是正確的你不能刪除父母之前,斷開孩子,如果沒有父母那麼這是好的,如果這樣先解除鏈接然後刪除 – 2014-09-29 09:35:54

回答

0

作爲回答發表評論爲相信是合適的答案;

「如果你試圖刪除這個直續集則是錯誤的是正確的,你不能刪除父之前取消鏈接的孩子,如果沒有父母,那麼這是好的,如果這樣斷開鏈接首先然後刪除」

+0

我可以在不清除'trap'記錄中的'agentip'字段的情況下執行此操作嗎? – 2014-09-29 09:46:56

+0

不幸的是,如果關係確實存在,則這是外地主機上的一個foriegn關鍵約束。你是通過mysql還是使用原則來做到這一點?如果您刪除了主機,您是否希望陷阱仍然存在? – 2014-09-29 09:50:33

+0

陷阱和主機需要存在而不需要彼此。可能有主機沒有陷阱(尚未),或沒有鏈接到主機的陷阱。之後,這些'孤兒'陷阱將顯示在網站的不同區域,但在服務器上收到陷阱的程序無法識別陷阱是否有主機,因此它將它們放在同一個表中數據庫。 – 2014-09-29 09:54:23