ちょうど気づいたのですが、propelは生成されたsetterメソッドで数値を文字列に変換します。これに関する私の問題は、ドイツ語ロケールを使用しているため、float値がドットではなくコンマで挿入されることです。例:「3.5」は文字列「3,5」になります。私はPostgreSQLを使用していますが、これは明らかに3.5を期待しています。
バージョン情報: 関連する場合は、PHP 5.3.9、Propel1.6とSymfony2.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"
この変換が行われる場所を見つけるのに少し時間がかかりました。ご覧のとおり、setAmount()でfloat値が文字列にキャストされています。これまで、float値を文字列にキャストすると、ロケール固有の小数点記号を含む文字列になることに気づきませんでした。
そもそもなぜpropelがfloat値を文字列に変換するのだろうか?これに対する回避策はありますか?
私が思いついた唯一の回避策は、本当に醜くて迷惑です。
setlocale(LC_ALL, 'en_US');
$ae->setAmount(3.5);
setlocale(LC_ALL, 'de_DE');