【问题标题】:Doctrine UniqueEntity doesn't work教义 UniqueEntity 不起作用
【发布时间】:2018-07-25 17:07:42
【问题描述】:

我有一张发票表。在这张表中,我有:

1- invoice_id 列,即PRIMARY KEY 和auto_increment。

2- invoice_number 列在数据库中是唯一的。

在我的实体中我有这个代码

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'

它不应该尝试保存而是显示验证消息

发票号已经存在

【问题讨论】:

  • 这看起来不错...还有更多相关信息吗?您是通过常规输入设置数字,还是还有更多?其他验证约束是否在项目中起作用?
  • 我编辑添加渲染代码的问题。是的,其他验证约束效果很好。
  • 将其从实体成员名称invoiceNumber更改为数据库字段名称invoice_number怎么样?
  • 你是直接和 MySQL 对话,为什么不在你的控制器中进行验证,SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1230008' for key 'invoice_number' 这是 MySQL 的响应,你需要在你的控制器中进行验证。
  • @YousefAltaf 我已经完成了,但它不起作用。

标签: symfony doctrine unique-constraint


【解决方案1】:

就我而言,UniqueEntity 注释中的属性fields 应该是一个数组,所以:

@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/…。
  • 转储一些东西到Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator的validate方法,看看是否到达那里。
  • 我已经在尝试这个了。 @MatíasNavarroCarter 我试试@UniqueEntity(fields={"invoiceNumber"})、@UniqueEntity(fields="invoiceNumber") 和@UniqueEntity("invoiceNumber")
  • @MohammedZayan 其他约束有效吗?也许您没有启用注释,因为它们默认情况下未启用。 symfony.com/doc/current/validation.html#configuration
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 2012-08-09
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 2016-02-28
相关资源
最近更新 更多