Я создаю приложение для регистрации SNMP Trap. У него есть две таблицы 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;
}
Отредактировано с ошибкой
Ошибка в том, что мне не разрешено удалять или усекать мою таблицу хостов, что должно быть возможно в моем приложении, потому что ловушки должны существовать без хоста.
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`))
Опубликовано как ответ из комментария, так как считаю подходящим ответ;
«Если вы пытаетесь удалить это как прямое продолжение, то да, ошибка верна, вы не можете удалить родителя до того, как отсоединить дочернего, если нет родителя, то это хорошо, если сначала отсоедините, а затем удалите»
Других решений пока нет …