Symfony 4-UniqueEntity:我希望多个公司可以为服务使用相同的名称,但是一个公司不能有两个具有相同名称的服务

问题描述 投票:0回答:2

在我的symfony项目中,我有一个groupValidators实体,该实体用于通过指示服务和用户的名称来在公司内部创建服务...

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;

并且我希望一家公司不能两次输入相同的服务名称(因此,我的@UniqueEntity),但是我仍然希望多个公司使用相同的名称来提供服务。例如,公司A可以有一个名为“商务”的服务,公司B也可以有。我该怎么办?因为当前,如果一家公司尝试使用已经用于另一家公司的服务的名称来创建服务,则我的约束会介入

symfony constraints entity unique
2个回答
0
投票

假设您拥有公司的ID,服务的名称以及该实体,则可以在表定义的两列上使用唯一约束:

/**
 *
 * @Table(name="GroupeValidateurs", 
 *    uniqueConstraints={
 *        @UniqueConstraint(name="service_entreprise", 
 *            columns={"service", "entreprise"})
 *    }
 * )
 */

0
投票

当您在班级名称中使用法语时,请务必小心。人们可能会认为您在这里谈论的是Validator,事实并非如此。我建议您将班级GroupeValidateurs重命名为更讲类似DivisionDepartmentService的名称。同样,当您使用类名时,请使用单数。

您需要做的是添加一个约束,以确保您没有很多次使用相同的服务名称。您使用注释正确地完成了该部分。

然后您想要:

  • 一家公司提供一项服务
  • 一项服务可以与许多公司相关

所以您的问题在这里

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

您需要在此处使用OneToMany,因为一项服务可能与许多公司有关

编辑:我可能已经误读了您的问题,但我没有看到您似乎希望一家公司不能只提供一项服务,而只能提供两项服务。对于这一部分,我们需要您提供公司类别。

© www.soinside.com 2019 - 2024. All rights reserved.