我剛剛注意到,這個propel將數值轉換爲生成的setter方法中的字符串。 我的問題是,因爲我使用的是德語語言環境,所以浮動值插入時用逗號而不是點。例如:「3.5」產生一個字符串「3,5」。 我使用的PostgreSQL,顯然預計3.5。爲什麼propel會將float屬性轉換爲字符串?
版本信息: 如果相關,我使用:PHP 5.3.9,Propel 1.6和Symfony 2.2。
詳細說明:
表定義看起來像這樣:
<table name="account_entry">
...
<column name="amount" type="decimal" size="12" scale="2" required="true" />
...
</table>
生成setAmount()方法是這樣的:
public function setAmount($v)
{
if ($v !== null && is_numeric($v)) {
$v = (string) $v;
}
if ($this->amount !== $v) {
$this->amount = $v;
$this->modifiedColumns[] = AccountEntryPeer::AMOUNT;
}
return $this;
} // setAmount()
在一個PostgreSQL保存對象的結果錯誤:
Invalid text representation: 7 ERROR: invalid input syntax for type numeric: "3,5"
我花了一段時間才找到發生這種轉換的地方。正如你所看到的,float值正在被轉換爲setAmount()中的字符串。到目前爲止,我從未注意到將一個浮點值轉換爲字符串會導致包含特定於語言環境的小數點分隔符的字符串。
我想知道爲什麼propel首先將float值轉換爲字符串? 有沒有一些解決方法呢?
我想出的唯一解決方法是非常醜陋和討厭:
setlocale(LC_ALL, 'en_US');
$ae->setAmount(3.5);
setlocale(LC_ALL, 'de_DE');
它似乎是[*默認*行爲](https://github.com/propelorm/Propel/blob/master/generator/lib/builder/om/PHP5ObjectBuilder.php#L1844-1873)來處理柱。但根據SQL的生成方式(例如插入),[看起來](https://github.com/propelorm/Propel/blob/master/generator/lib/builder/sql/DataSQLBuilder.php#L172 -180),它應該被鑄造*再次*以匹配本地列類型。您可以檢查[Github上的問題](https://github.com/propelorm/Propel/issues)和/或提交一個 – j0k 2013-03-26 08:57:52
感謝您的研究。我在推送郵件列表上發佈了這個問題。我想避免創建錯誤報告,如果它可能不是一個錯誤。 – Leif 2013-03-26 09:44:46