我不知道這是否是一個錯誤,但我使用Doctrine 2.3.0
,我發現persist/flush
行爲很奇怪。我有一個基本的表格:學說爲未定義字段插入NULL值
------------------
| 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
告訴我,Doctrine
執行下面的查詢(這是由看DB
確認):
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;
}
+1爲黑客,我會試試看。你能澄清你的意思嗎?「我建議你查看數據庫記錄插入邏輯」:AFAIK做部分'INSERT'(即不是所有字段都在'VALUES'中定義的地方)是完全合法的,所以使用'對'MySQL'字段的DEFAULT'約束,當'INSERT/UPDATE'期間沒有提供字段時,其預期行爲是爲字段提供默認值:http://stackoverflow.com/questions/3357953/default-a-column-with-空字符串。我該如何獲得'DEFAULT'約束值才能真正被使用? (而不是由'Doctrine'插入的'NULL')? – Max
我正在使用該類中的屬性的設置默認值。晚些時候會檢查,如果不會忘記。 –