Symfony 4: Добавьте ограничение new UniqueEntity () к x, если y равно нулю - PullRequest
2 голосов
/ 02 июля 2019

У меня есть класс сущностей с двумя свойствами: страна и штат.Записи в базе данных должны быть уникальными.Это означает, что если я отправляю страну = Германия и штат = ВВ в базу данных, она добавляет новую запись, если такая же запись еще не существует.

Однако государственная собственность может быть нулевой, в этом случае она не отображается доктриной (?), И я все еще могу предоставить значение для страны.Проблема в том, что мне не удается сделать эту запись уникальной, то есть вы не сможете вводить одну и ту же страну несколько раз без уникального состояния.Вот где я борюсь.

Я пробовал различные модификации ограничений сущностей.

Вот код, который проверяет, что страна и штат являются уникальной записью в базе данных:

public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addConstraint(new UniqueEntity([
            'fields' => ['country', 'state'],
            'message' => 'State is already used with this country!',
        ]));
    }

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

https://www.doctrine -project.org / проекты / Доктрина-ОРМ / ы / 2,6 / учебники / композит первичной keys.html

Может быть, сущность с составным первичным ключом может хорошо работать для вас.

/**
 * @UniqueEntity
 */
class UniqueEntity
{
    /** @Id @Column(type="string") */
    private $country;
    /** @Id @Column(type="string") */
    private $state = 'empty'; // case you have no state and a primary key can't be null

    public function __construct($country, $state)
    {
        $this->country= $country;
        $this->state= $state;
    }

    public function getCountry()
    {
        return $this->country;
    }

    public function getState()
    {
        return $this->state;
    }
}

Единственным ограничением является то, что вы не можете иметь нулевое значение в качестве состояния, если это первичный ключ. Но опять же, вы можете иметь значение по умолчанию, например, «нет», в качестве значения состояния, которое будет одновременно приемлемым ключом. и уникальное значение

0 голосов
/ 04 июля 2019

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

<?php

namespace XXX;

use XXX\Services\CountryAndStateService;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class CountryAndStateValidator extends ConstraintValidator
{
/**
 * @var countryAndStateService
 */
 private $countryAndStateService;

   /**
    * CountryAndState constructor.
    */
     public function __construct(CountryAndStateService $countryAndStateService)
     {
         $this->countryAndStateService = $countryAndStateService;
     }

     /**
     * Taking country and state; validating whether the same country with state === null does already exist.
     *
     */
     public function validate($value, Constraint $constraint)
     {
        /* Accessing user input of state and country */
        $state = $this->context->getRoot()->getData()->getState();
        $country = $this->context->getRoot()->getData()->getCountry();

        /* Comparing the country user input to the country data in the database */
        $existingCountry = $this->countryAndStateService->getCountryByCountry($country);

        if ($state === null) {
            if ($existingCountry) {
                $this->context->buildViolation($constraint->message)
                    ->addViolation();
            } else {
                return;
            }
         }else {
            return;
        }
    }
}
...