我有以下实体:
class Employee {
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $employeeId;
/**
* @ORMColumn(type="string", length=45, unique=true)
*/
protected $username;
/**
* @ORMColumn(type="string", length=255, nullable=false)
*/
protected $email;
我正在运行以下代码:
$employee = new Employee();
$employee->setUsername('test');
$em = $this->getDoctrine()->getManager();
$em->persist($employee);
$em->flush();
如您所见,我没有为电子邮件列设置值。
但是在坚持中,我得到:
SQLSTATE[23000]:完整性约束冲突:1048 列"电子邮件"不能为空
因为原则将所有实体列添加到 INSERT 查询并为电子邮件列设置 null 值。
有没有办法跳过插入时不设置列?或者使 Doctrine 插入 ''(空字符串)作为非空字符串列的默认值?
您可以允许null
列,设置nullable=true
:
/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
protected $email;
这不会引发 SQL 错误。但是,如果要保持一致性,请使用验证,以便在持久性之前处理空字段:
use SymfonyComponentValidatorConstraints as Assert;
...
/**
* @AssertNotBlank()
* @ORMColumn(type="string", length=255)
*/
protected $email;
通过这种方式,您可以以更具体的方式处理验证错误,例如文档中所述:
$author = new Author();
// ... do something to the $author object
$validator = $this->get('validator');
$errors = $validator->validate($author);
if (count($errors) > 0) {
return new Response(print_r($errors, true));
} else {
return new Response('The author is valid! Yes!');
}
如果您只想要列的纯默认值,请查看此问题。
我似乎只需要使用实体__construct来设置默认值:
__construct() {
$this->email = '';
}
你的数据模型的问题,而不是学说的问题。您明确声明每条记录都应该在电子邮件列中具有一些值。因此,要么从实体中删除 NOT NULL 约束,要么只是在电子邮件列上设置一些值。在这种情况下,教义只是做你告诉它要做的事情。