Doctrine为未定义的字段插入NULL值

时间:2012-10-23 19:24:39

标签: doctrine-orm

我不知道这是不是一个错误,但我使用的是Doctrine 2.3.0,我发现persist/flush行为很奇怪。我有一张基本的表格:

------------------
|   test         |
------------------
| id   INT | AI  |
| field1 VARCHAR |
| field2 VARCHAR |
-----------------

当我通过仅设置field1

创建条目时
$test = new Entities\test();
$test->setField1('foo');
$em->persist($test);
$em->flush();

Doctrine\DBAL\Logging\EchoSQLLogger告诉我(通过查看DB确认Doctrine执行以下查询:

INSERT INTO test (field1, field2) VALUES (?, ?)
array(2) {
  [1]=>
  string(3) "foo"
  [2]=>
  NULL
}

如您所见,虽然我没有设置field2,但Doctrine确实将其放在带有NULL值的insert语句中。

我的所有实体都有这种行为,这是有问题的,因为在进行插入时,我未设置的字段的默认DB值会被NULL覆盖。

这是Doctrine的预期默认行为,有没有办法将其关闭(即排除我未在INSERT语句中设置的字段)?

我应该补充一点,我的实体是通过逆向工程自动生成的,其中一个字段的声明看起来像这样

/**
 * @var string $field2
 *                                       // removing nullalble makes no diff.
 * @ORM\Column(name="field2", type="string", length=45, nullable=true)
 */
private $field2;

/**
 * Set field2
 *
 * @param string $field2
 * @return Test
 */
public function setField2($field2)
{
    $this->field2 = $field2;
    return $this;
}

1 个答案:

答案 0 :(得分:1)

我认为这是默认行为,因为在一个INSERT语句中创建完整记录可以被视为逻辑。但我可能会误会。某种@ORM\Column(type="boolean", columnDefinition="TINYINT(1) NULL DEFAULT 0")可以被视为黑客,但解决方案。我建议你查看数据库记录插入逻辑。