Доктрина UniqueEntity не работает

У меня есть таблица счетов. В этой таблице у меня есть:

1 - столбец invoice_id, который представляет собой PRIMARY KEY и auto_increment.

2- столбец invoice_number, который уникален в БД.

В моем Entity у меня есть этот код

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * Invoices
 *
 * @ORM\Table(name = "invoices", uniqueConstraints = {@ORM\UniqueConstraint(name = "invoice_number", columns = {"invoice_number"})})
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 *
 *  @UniqueEntity(fields = "invoiceNumber", message = "invoice number is already exist")
 */
class Invoices
{

    /**
     * @var integer
     *
     * @ORM\Column(name = "invoice_id", type = "integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "IDENTITY")
     */
    private $invoiceId;

    /**
     * @var string
     *
     * @ORM\Column(name = "invoice_number", type = "string", length=50, nullable=true, unique=true)
     */
    private $invoiceNumber;

В контроллере я использую $form->isValid() вот так

$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {

}

Я визуализирую поле этим кодом

{{ form_label(form.salesInvoice.invoice.invoiceNumber, null, {'label_attr':{'class':'black'}}) }} <span class = "required">*</span>
{{ form_widget(form.salesInvoice.invoice.invoiceNumber) }}
<div class = "required"> {{ form_errors(form.salesInvoice.invoice.invoiceNumber) }}</div>

Когда я пытаюсь сохранить счет с повторяющимся invoice_number, у меня появляется эта ошибка

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1230008' for key 'invoice_number'

Он не должен пытаться сохранить, но должен показывать сообщение проверки

invoice number is already exist

Выглядит нормально ... есть еще актуальная информация? Вы устанавливаете номер через обычный ввод или это еще не все? Работают ли в проекте другие ограничения валидации?

Padam87 25.07.2018 20:00

Редактирую вопрос, добавляя код рендеринга. Да, другие ограничения валидации работают хорошо.

Mohammed Zayan 25.07.2018 20:18

Как насчет того, чтобы изменить его с имени члена сущности invoiceNumber на имя поля БД invoice_number?

Andrew Nolan 25.07.2018 22:44

Вы напрямую разговариваете с MySQL, почему бы вам не выполнить проверку в своем контроллере, SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1230008' for key 'invoice_number' это ответ MySQL, вам необходимо выполнить проверку в своем контроллере.

Yousef Altaf 26.07.2018 09:54

@YousefAltaf Я уже сделал, и это не работает.

Mohammed Zayan 26.07.2018 16:18

@AndrewNolan Я не понимаю, о чем вы.

Mohammed Zayan 26.07.2018 16:19
Стоит ли изучать 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
6
1 061
1

Ответы 1

Насколько мне известно, свойство fields в аннотации UniqueEntity должно быть массивом, поэтому:

@UniqueEntity(fields = {"invoiceNumber"}, message = "invoice number is already exist")

Вместо:

@UniqueEntity(fields = "invoiceNumber", message = "invoice number is already exist")

Это должно сработать.

Это тоже был первый инстинкт, но попробовал, и работает в обоих направлениях. (По крайней мере, в 4.1)

Padam87 25.07.2018 21:03

Очевидно, довольно много с первого дня github.com/symfony/symfony/commit/….

Padam87 25.07.2018 21:06

Сбросьте что-нибудь в метод validateSymfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityVa‌​lidator, чтобы посмотреть, доходит ли там.

Matías Navarro Carter 25.07.2018 21:06

Я уже пробую это. @ MatíasNavarroCarter Я пробую @UniqueEntity(fields = {"invoiceNumber"}), @UniqueEntity(fields = "invoiceNumber") и @UniqueEntity("invoiceNumber")

Mohammed Zayan 26.07.2018 07:44

@MohammedZayan работает ли ограничение других? Возможно, у вас нет разрешенных аннотаций, поскольку они не включены по умолчанию. symfony.com/doc/current/validation.html#configuration

Smaïne 16.08.2018 09:38

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