Обнаружение ошибки при повторяющейся записи для ManytoMany

В Symfony3.4 я пытаюсь объединить две сущности, и если это уже дано, я получил ошибку «повторяющаяся запись». Это делается через отношение Many2Many в доктрине.

Пользователь: компания <---Many2Many---> Компания: пользователи

Как я могу отловить ошибку в действии контроллера, чтобы отреагировать на нее?

Пользовательская сущность:

    /**
     * @ORM\Table(name = "md_user")
     * @ORM\Entity(repositoryClass = "AppBundle\Repository\UserRepository")
     * @Vich\Uploadable
     * @ApiResource(
     *     collectionOperations = {
     *      "get" = {"method" = "GET"},
     *     "post" = {"method" = "POST"}
     *     },
     *     itemOperations = {
     *      "get" = {"method" = "GET", "access_control_message" = "Sorry, but you are not allowed to do this."},
     *      "put" = {"method" = "PUT"}
     *         },
     *     attributes = {"access_control" = "is_granted('ROLE_USER')"})
     * @ORM\AttributeOverrides({
     *      @ORM\AttributeOverride(name = "usernameCanonical",
     *          column=@ORM\Column(
     *              name     = "username_canonical",
     *              length   = 191,
     *              unique   = true
     *          )
     *      ),
     *      @ORM\AttributeOverride(name = "emailCanonical",
     *          column=@ORM\Column(
     *              name     = "email_canonical",
     *              length   = 191,
     *              unique   = false,
     *              nullable=true
     *          )
     *      )
     *
     * })
     */

    class User extends BaseUser
    {

        public function __construct()
        {
            parent::__construct();

            $this->created         = new \DateTime();
            $this->company = new ArrayCollection();
            $this->roles = array('ROLE_USER');

        }

        /**
         * @ORM\Id
         * @ORM\Column(type = "integer")
         * @ORM\GeneratedValue(strategy = "AUTO")
         */
        protected $id;

        /**
         * @ORM\ManyToMany(targetEntity = "AppBundle\Entity\Company",inversedBy = "users")
         * @ORM\JoinTable(name = "user_comp_comp_user",
         *      joinColumns = {@ORM\JoinColumn(name = "user_id", referencedColumnName = "id")},
         *      inverseJoinColumns = {@ORM\JoinColumn(name = "company_id", referencedColumnName = "id")}
         * )
         */
        protected $company;

    /**
     * @return mixed
     */
    public function getCompany()
    {
        return $this->company;
    }

    /**
     * @param mixed $company
     * @return User
     */
    public function setCompany($company)
    {
        $this->company = $company;
        return $this;
    }

/**
     * @param Company $company
     */
    public function addCompany(Company $company)
    {
        if ($this->company->contains($company)) {
            return;
        }
        $this->company[] =$company;
        return $this;
    }
    /**
     * @param Company $company
     */
    public function removeCompany(Company $company)
    {
        if (!$this->company->contains($company)) {
            return;
        }
        $this->company->removeElement($company);
        $company->removeUser($this);
    }

Юридическое лицо компании:

    class Company
    {

        public function __construct()
        {

            $this->created         = new \DateTime();
            $this->users = new ArrayCollection();
        }

        /**
         * @ORM\Id
         * @ORM\Column(type = "integer")
         * @ORM\GeneratedValue(strategy = "AUTO")
         */
        protected $id;

        /**
         * @ORM\Column(name = "mandant",type = "integer",nullable=true)
         */
        protected $mandant;

        /**
         * @ORM\Column(type = "integer",nullable=true)
         */
        protected $customer_group;

        /**
         * @var \Doctrine\Common\Collections\Collection|Company[]
         * @ORM\ManyToMany(targetEntity = "User",mappedBy = "company")
         */
        protected $users;

 /**
     * @return Company[]|\Doctrine\Common\Collections\Collection
     */
    public function getUsers()
    {
        return $this->users;
    }

    /**
     * @param Company[]|\Doctrine\Common\Collections\Collection $users
     * @return Company
     */
    public function setUsers($users)
    {
        $this->users = $users;
        return $this;
    }

/**
     * @param User $user
     */
    public function addUser(User $user)
    {
        if ($this->users->contains($user)) {
            return;
        }
        $this->users[] =$user;
        return $this;
    }
    /**
     * @param User $user
     */
    public function removeUser(User $user)
    {
        if (!$this->users->contains($user)) {
            return;
        }
        $this->users->removeElement($user);
        $user->removeCompany($this);
    }

Упрощенное действие контроллера:

$user = $this->getDoctrine()->getRepository(User::class)->find($id);
$company = $this->getDoctrine()->getRepository(Company::class)->find($company_id);
$user->addCompany($company);
try {
            $this->getDoctrine()->getManager()->merge($user);
            $this->getDoctrine()->getManager()->flush();
        }catch (UniqueConstraintViolationException $e) {
                return new JsonResponse(array('success' => false,'error'=> $e->getMessage()));
        }
Стоит ли изучать 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 нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нашел сам. Чтобы проверить наличие дубликатов перед промывкой, вы можете использовать addCompany() в User.

public function addCompany(Company $company)
    {
        if ($this->company->contains($company)) {
            return;
        }
        $this->company[] =$company;
        return $this;
    }

Это проверяет, введена ли уже запись. если нет, то возвращается.

В контроллере это можно сделать так:

if (!$user->addCompany($company)){
    return new JsonResponse(array('success' => false,'error'=> 'duplicate entry'));
}

Надеюсь, это кому-то поможет.

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