我正在使用Sonata Admin
捆绑。当我提交"创建实体"如果表单有一些空字段,则抛出ModelManagerException
形式。
我已将此跟踪到首先抛出的PDOException
。抛出异常是因为我的空字段获取空值,但我的表不允许空值。我不想要空字段,我想要空字符串。如何告诉Sonata Admin
类为没有值的字段创建空字符串而不是空字符的新实体?
这是抛出异常的查询:
INSERT INTO some_table (name, username, email) VALUES (?, ?, ?)' with params [null, "my name", "test@mailinator.com"]
以下是例外情况:
ModelManagerException: Failed to create object: Acme\DemoBundle\Entity\SomeEntity
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null
PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null
我尝试在$this->name = '';
构造函数中明确设置SomeEntity
,但它没有帮助。该查询仍然有null
而不是''
。我尝试在我的getNewInstance()
课程上覆盖Admin
以将name
设置为''
值,但它也没有帮助 - 查询仍然有null
代替
奇怪的是,我可以在实体编辑表单上有空字段 - 实体更新正常,空字段正确保存到数据库。为什么会这样?
示例代码:
<?php
namespace Acme\DemoBundle\Entity
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="some_table")
*/
class SomeEntity
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255)
*
* We can't use Assert\NotNull()
* because Admin bundle uses null values for empty fields!
*/
protected $name;
// Other fields and methods.
}
答案 0 :(得分:0)
你有两个选择:
1-如果您希望name字段可以为null,则需要编辑名称注释:
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected $name;
2-如果您希望在创建新实例时名称字段只是一个空字符串,则只需在entityAdmin中添加prePersist:
public function prePersist($object)
{
$object->setName('');
}
我希望它有所帮助:)
答案 1 :(得分:0)
有一些与此相关的DBAL异常。在symfony异常页面上向下滚动,您将看到它。