2012-10-23 71 views
2

我不知道這是否是一個錯誤,但我使用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 
} 

正如你所看到的,雖然我沒有設置field2Doctrine確實將它放在插入語句中,其值爲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

我想這是默認行爲,因爲它可能是處理邏輯以在一個INSERT語句中創建完整記錄。但我可能會誤解。有一些@ORM\Column(type="boolean", columnDefinition="TINYINT(1) NULL DEFAULT 0")可以被視爲黑客,但解決方案。我建議您查看數據庫記錄插入邏輯。

+0

+1爲黑客,我會試試看。你能澄清你的意思嗎?「我建議你查看數據庫記錄插入邏輯」:AFAIK做部分'INSERT'(即不是所有字段都在'VALUES'中定義的地方)是完全合法的,所以使用'對'MySQL'字段的DEFAULT'約束,當'INSERT/UPDATE'期間沒有提供字段時,其預期行爲是爲字段提供默認值:http://stackoverflow.com/questions/3357953/default-a-column-with-空字符串。我該如何獲得'DEFAULT'約束值才能真正被使用? (而不是由'Doctrine'插入的'NULL')? – Max

+0

我正在使用該類中的屬性的設置默認值。晚些時候會檢查,如果不會忘記。 –