Отсутствует значение идентификатора первичного ключа в App \ Entity symfony

Мое отношение между двумя объектами - это отношение 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;
    }

}
  1. UserContact Entity:

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

опубликуйте свои полные объекты User и UserContact

Tomasz Madeyski 09.04.2018 09:23

вопрос отредактировал. пожалуйста, проверьте

narayansharma91 09.04.2018 09:42

Я не уверен, но я считаю, что OneToOne ожидает, что набор столбцов в referencedColumnName (user_id в вашем случае) является первичным ключом. Попробуйте переместить (и / или добавить) @ORM\Id() из UserContact в user_id

Tomasz Madeyski 09.04.2018 09:52

Вы хотите сказать, добавьте этот @ORM \ Id () в столбец user_id. ? user_id - это ForeignKey таблицы пользователей. Это не сработает, потому что @ORM \ Id () использует в нескольких столбцах 1 для своего первичного ключа и еще один для user_id.

narayansharma91 09.04.2018 10:03

Идентификатор пользовательских объектов является первичным, а user_id для объектов userContact - FK таблицы пользователей.

narayansharma91 09.04.2018 10:04

вот что я говорю. Поскольку OneToOne требует, чтобы user_id был первичным ключом, вам нужно сделать хак, который устанавливает составной первичный ключ (с двумя столбцами: id и user_id)

Tomasz Madeyski 09.04.2018 10:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
6
2 119
1

Ответы 1

В вашей ассоциации владельцем является User, а обратной стороной - UserContact. Вы должны использовать mappedBy для обратной стороны вместо inversedBy. Итак, ваша аннотация для атрибута $user в сущности пользователя должна быть такой:

/** * @ORM\OneToOne(targetEntity = "User", mappedBy = "UserContact") */ private $user;

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork-associations.html

что вы имеете в виду под собственником?

narayansharma91 09.04.2018 13:08

Собственная сторона в отношении доктрины - это сторона, у которой есть внешний ключ. См. Ссылку, которую я предоставил в своем ответе.

amirmodi 09.04.2018 13:14

Другие вопросы по теме