Мое отношение между двумя объектами - это отношение OneToOne.
1) Пользовательский объект:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass = "App\Repository\UserRepository")
*/
class User
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type = "integer")
*/
private $id;
/**
* @var $userContact
*
* @ORM\OneToOne(targetEntity = "UserContact" , inversedBy = "User")
* @ORM\JoinColumn(name = "id", referencedColumnName = "user_id", nullable=false)
**/
private $userContact;
/**
* @ORM\Column(type = "string", length=255)
*/
private $last_name;
public function getId()
{
return $this->id;
}
public function getLastName(): ?string
{
return $this->last_name;
}
public function setLastName(string $last_name): self
{
$this->last_name = $last_name;
return $this;
}
}
class UserContact
{
/**
* @var integer
*
* @ORM\Column(name = "id", type = "integer")
* @ORM\Id()
* @ORM\GeneratedValue(strategy = "AUTO")
*/
private $id;
/**
* @ORM\Column(type = "integer")
*/
private $user_id;
/**
* @ORM\OneToOne(targetEntity = "User", inversedBy = "UserContact")
*/
private $user;
/**
* @ORM\Column(type = "string", length=255)
*/
private $mobile_number;
public function getId()
{
return $this->id;
}
public function getUserId(): ?int
{
return $this->user_id;
}
public function setUserId(int $user_id): self
{
$this->user_id = $user_id;
return $this;
}
public function getMobileNumber(): ?string
{
return $this->mobile_number;
}
public function setMobileNumber(string $mobile_number): self
{
$this->mobile_number = $mobile_number;
return $this;
}
}
Мой пользовательский репозиторий выглядит так:
class UserRepository extends ServiceEntityRepository
{
public function index() {
return $this->createQueryBuilder('u')
->innerJoin('u.userContact', 'uc')
->getQuery()
->execute();
}
}
А контроллер выглядит так:
public function index()
{
$users = $em->getRepository('App:User')->index();
}
Это вызывает ошибку, подобную этой:
Missing value for primary key id on App\Entity\UserContact
вопрос отредактировал. пожалуйста, проверьте
Я не уверен, но я считаю, что OneToOne ожидает, что набор столбцов в referencedColumnName (user_id в вашем случае) является первичным ключом. Попробуйте переместить (и / или добавить) @ORM\Id() из UserContact в user_id
Вы хотите сказать, добавьте этот @ORM \ Id () в столбец user_id. ? user_id - это ForeignKey таблицы пользователей. Это не сработает, потому что @ORM \ Id () использует в нескольких столбцах 1 для своего первичного ключа и еще один для user_id.
Идентификатор пользовательских объектов является первичным, а user_id для объектов userContact - FK таблицы пользователей.
вот что я говорю. Поскольку OneToOne требует, чтобы user_id был первичным ключом, вам нужно сделать хак, который устанавливает составной первичный ключ (с двумя столбцами: id и user_id)




В вашей ассоциации владельцем является User, а обратной стороной - UserContact. Вы должны использовать mappedBy для обратной стороны вместо inversedBy. Итак, ваша аннотация для атрибута $user в сущности пользователя должна быть такой:
/**
* @ORM\OneToOne(targetEntity = "User", mappedBy = "UserContact")
*/
private $user;
что вы имеете в виду под собственником?
Собственная сторона в отношении доктрины - это сторона, у которой есть внешний ключ. См. Ссылку, которую я предоставил в своем ответе.
опубликуйте свои полные объекты
UserиUserContact