【问题标题】:Doctrine inserting NULL values for undefined fields为未定义字段插入 NULL 值的学说
【发布时间】:2012-10-23 19:24:39
【问题描述】:

我不知道这是否是一个错误,但我使用的是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 值。

我的所有实体都有这种行为,这是有问题的,因为在执行插入时,我未设置的字段的默认 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;
}

【问题讨论】:

    标签: doctrine-orm


    【解决方案1】:

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

    【讨论】:

    • +1 为黑客,我会试试看。您能否澄清“我建议您查看数据库记录插入逻辑”的意思:AFAIK 做部分INSERT(即并非所有字段都在VALUES 中定义)是完全合法的,所以使用@ 987654325@ MySQL 字段上的约束,其预期行为是在 INSERT/UPDATE 期间未提供时为字段提供默认值:stackoverflow.com/questions/3357953/…。我应该如何获得实际使用的 DEFAULT 约束值? (而不是由Doctrine 插入的NULL)?
    • 我正在使用为类中的属性设置默认值。晚上会检查,如果不会忘记。
    猜你喜欢
    • 2016-02-27
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多