En mi proyecto de Symfony tengo una entidad groupValidators que se utiliza para crear un servicio dentro de una empresa indicando el nombre del servicio y los usuarios ...

GroupeValidateurs.php:

<?php

namespace App\Entity;

use Cocur\Slugify\Slugify;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity(repositoryClass="App\Repository\GroupeValidateursRepository")
 * @ORM\HasLifecycleCallbacks()
 *  @UniqueEntity(
 *  fields = {"nom"},
 *  message = "Ce nom a déjà été utilisé"
 * )
 */
class GroupeValidateurs
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * Nom du service
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank
     */
    private $nom;

    /**
     * Liste des utilisateurs membres du service
     * @ORM\OneToMany(targetEntity="App\Entity\User", mappedBy="groupe")
     */
    private $users;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $slug;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Validateur", mappedBy="groupeValidateurs", orphanRemoval=true, cascade={"persist", "remove"})
     * @ORM\OrderBy({"ordre" = "ASC"})
     */
    private $validateurs;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Entreprise", inversedBy="services")
     * @ORM\JoinColumn(nullable=true)
     */
    private $entreprise;

Y quiero que una compañía no pueda ingresar el mismo nombre de servicio dos veces (de ahí mi @UniqueEntity), pero todavía quiero que más de una compañía use el mismo nombre para un servicio. Por ejemplo, la empresa A puede tener un servicio llamado "Comercio" y la empresa B también. ¿Cómo podría hacer eso? Porque actualmente, si una empresa intenta crear un servicio con un nombre ya utilizado para el servicio de otra empresa, tengo mi restricción que interviene

0
eronn 10 dic. 2019 a las 13:23

2 respuestas

La mejor respuesta

Suponiendo que tiene la identificación de la empresa y el nombre del servicio en esta entidad, puede usar una restricción única en dos columnas en la definición de su tabla:

/**
 *
 * @Table(name="GroupeValidateurs", 
 *    uniqueConstraints={
 *        @UniqueConstraint(name="service_entreprise", 
 *            columns={"service", "entreprise"})
 *    }
 * )
 */
2
Yoann Mir 10 dic. 2019 a las 11:55

Debes tener cuidado cuando uses francés en el nombre de tu clase. La gente podría pensar que aquí estás hablando de Validator, que no es el caso. Le sugiero que cambie el nombre de su clase GroupeValidateurs a algo más hablando como Division o Department o Service. Además, cuando usa un nombre de clase, use singular.

Lo que debe hacer es agregar una restricción para asegurarse de que no tiene muchas veces el mismo nombre de servicio. Hiciste esa parte correctamente con tu anotación.

Entonces quieres:

  • Una compañía tiene un servicio
  • Un servicio puede estar relacionado con muchas compañías

Entonces tu problema está aquí

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Entreprise", inversedBy="services")
 * @ORM\JoinColumn(nullable=true)
 */
private $entreprise;

Debe usar OneToMany aquí ya que un servicio puede estar relacionado con muchas compañías

EDITAR: Podría haber leído mal su pregunta. No lo vi. Parece que quiere que una compañía no tenga un solo servicio, sino dos servicios. Para esta parte, necesitamos que proporcione su clase de empresa.

0
Minirock 10 dic. 2019 a las 11:22