Zend Framework 3, Doctrine 2. Я создал несколько отображений 2 таблиц MySQL
/**
* @ORM\Entity
* @ORM\Table(name="object")
*/
class Object
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(name="id")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="..\Host", inversedBy="object")
* @ORM\JoinColumn(name="ip", referencedColumnName="IP")
*/
protected $host;
}
/**
* @ORM\Entity
* @ORM\Table(name="host")
*/
class Host
{
/**
* @ORM\Id
* @ORM\Column(name="IP")
*/
protected $ip;/**
* @ORM\OneToOne(targetEntity="..\Object", mappedBy="host")
* @ORM\JoinColumn(name="IP", referencedColumnName="ip")
*/
protected $object;
}
У меня есть эта ошибка:
Ошибка «Отсутствует значение для идентификатора первичного ключа в .. \ Object».
Зачем? Похоже, что сделано по примеру -> 5.3. One-To-One, двунаправленный с сайта Doctrine
Параметры, передаваемые в JoinColumn, неверны. Вы можете проверить документ для JoinColumn Вот.
Попробуйте вот так:
// For Object class:
// @ORM\JoinColumn(name="host_ip", referencedColumnName="ip")
// For Host class
// @ORM\JoinColumn(name="object_id", referencedColumnName="id")
В дополнение к этому: mappedBy не поддерживается в аннотациях OneToOne. Вы можете использовать targetEntity и inversedBy, но не mappedBy.
С другой стороны, сделать ip вашим первичным ключом кажется неправильным. Вы должны иметь автоматически сгенерированный первичный идентификатор для хоста и использовать его для соединения сущностей. Вы все еще можете установить свое поле ip как уникальное, поэтому у вас не будет дубликатов. Кроме того, у вас нет других полей, вы можете просто поместить ip в класс Object.
Кроме того, я не рекомендую использовать Object в качестве имени вашего класса. Это слишком общее.
Других решений пока нет …