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
2 respuestas
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"})
* }
* )
*/
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.
Nuevas preguntas
symfony
Symfony se refiere tanto a un marco PHP para crear aplicaciones web como a un conjunto de componentes sobre los que se construye el marco. Esta etiqueta se refiere a las versiones principales 3.x, 4.xy 5.x que se admiten actualmente. Alternativamente, puede especificar una versión exacta utilizando la etiqueta correspondiente. Esta etiqueta no debe usarse para preguntas sobre Symfony 1.x. En su lugar, utilice la etiqueta Symfony1.