1

我有以下实体:

class Employee {

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $employeeId;

/**
 * @ORM\Column(type="string", length=45, unique=true)
 */
protected $username;

/**
 * @ORM\Column(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 列“电子邮件”不能为空

因为 Doctrine 将所有实体列添加到 INSERT 查询并为电子邮件列设置空值。

有没有办法跳过插入时未设置的列?或者让Doctrine插入''(空字符串)作为非空字符串列的默认值?

4

3 回答 3

2

您可以允许您的列是null,设置nullable=true

/**
 * @ORM\Column(type="string", length=255, nullable=true)
 */
protected $email;

这不会引发 SQL 错误。但是,如果您想保持一致,请使用验证,以便您可以在持久性之前处理空字段:

use Symfony\Component\Validator\Constraints as Assert;

...

/**
 * @Assert\NotBlank()
 * @ORM\Column(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!');
}

如果您只想要列的普通默认值,请查看此问题

于 2012-10-08T11:16:28.970 回答
0

我似乎只需要使用实体 __construct 来设置默认值:

__construct() {
    $this->email = '';
}
于 2012-10-08T10:28:04.553 回答
0

这是您的数据模型而不是教义的问题。您明确声明每条记录都应在电子邮件列中具有某些值。因此,要么从实体中删除 NOT NULL 约束,要么只是在电子邮件列上设置一些值。在这种情况下,教义只是做你告诉它去做的事情。

于 2012-10-08T11:00:00.040 回答