У меня есть таблица счетов. В этой таблице у меня есть:
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
Редактирую вопрос, добавляя код рендеринга. Да, другие ограничения валидации работают хорошо.
Как насчет того, чтобы изменить его с имени члена сущности invoiceNumber на имя поля БД invoice_number?
Вы напрямую разговариваете с MySQL, почему бы вам не выполнить проверку в своем контроллере, SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1230008' for key 'invoice_number' это ответ MySQL, вам необходимо выполнить проверку в своем контроллере.
@YousefAltaf Я уже сделал, и это не работает.
@AndrewNolan Я не понимаю, о чем вы.




Насколько мне известно, свойство fields в аннотации UniqueEntity должно быть массивом, поэтому:
@UniqueEntity(fields = {"invoiceNumber"}, message = "invoice number is already exist")
Вместо:
@UniqueEntity(fields = "invoiceNumber", message = "invoice number is already exist")
Это должно сработать.
Это тоже был первый инстинкт, но попробовал, и работает в обоих направлениях. (По крайней мере, в 4.1)
Очевидно, довольно много с первого дня github.com/symfony/symfony/commit/….
Сбросьте что-нибудь в метод validateSymfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator, чтобы посмотреть, доходит ли там.
Я уже пробую это. @ MatíasNavarroCarter Я пробую @UniqueEntity(fields = {"invoiceNumber"}), @UniqueEntity(fields = "invoiceNumber") и @UniqueEntity("invoiceNumber")
@MohammedZayan работает ли ограничение других? Возможно, у вас нет разрешенных аннотаций, поскольку они не включены по умолчанию. symfony.com/doc/current/validation.html#configuration
Выглядит нормально ... есть еще актуальная информация? Вы устанавливаете номер через обычный ввод или это еще не все? Работают ли в проекте другие ограничения валидации?