Doctrine orm 为未定义的字段插入空值的原则

Doctrine orm 为未定义的字段插入空值的原则,doctrine-orm,Doctrine Orm,我不知道这是否是一个bug,但我使用的是原则2.3.0,我发现持久化/刷新行为非常奇怪。我有一个基本表: ------------------ | test | ------------------ | id INT | AI | | field1 VARCHAR | | field2 VARCHAR | ----------------- 当我仅通过设置字段1创建条目时: $test = new Entities\test(); $test->setField

我不知道这是否是一个bug,但我使用的是
原则2.3.0
,我发现
持久化/刷新
行为非常奇怪。我有一个基本表:

------------------
|   test         |
------------------
| id   INT | AI  |
| field1 VARCHAR |
| field2 VARCHAR |
-----------------
当我仅通过设置
字段1
创建条目时:

$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
确实将其放入insert语句中,并带有
NULL

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

这是条令的预期默认行为吗?有没有办法关闭它(即从
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;
}

我认为这是默认行为,因为在一条INSERT语句中创建完整记录是合乎逻辑的。但我可能弄错了。拥有某种类型的
@ORM\Column(type=“boolean”,columnDefinition=“TINYINT(1)NULL DEFAULT 0”)
可以被视为一种黑客行为,但不是解决方案。我建议您检查数据库记录插入逻辑

+1对于黑客,我将尝试一下。您能否澄清“我建议您检查数据库记录插入逻辑”的含义:进行部分插入(即并非所有字段都在值中定义)是完全合法的。,在
MySQL
字段上使用
DEFAULT
约束也是如此,其预期行为是在
INSERT/UPDATE
期间未提供字段的默认值时为字段提供默认值。我应该如何获得实际使用的
默认
约束值?(我使用的是为类中的属性设置默认值,而不是由
Doctrine
插入的
NULL
)。如果你不忘的话,我会晚些时候再查。