Доктрина 2 Отображение 2 таблиц, ошибка

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

1

Решение

Параметры, передаваемые в 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 в качестве имени вашего класса. Это слишком общее.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]