私は気づいたばかりですが、そのプロペラは生成されたセッターメソッドで数値を文字列に変換します。 私はドイツ語のロケールを使用しているので、浮動小数点値はドットの代わりにコンマで挿入されています。たとえば、「3.5」の場合、文字列「3,5」になります。 PostgreSQLを使用していますが、明らかに3.5が必要です。propelがfloatプロパティをstringに変換するのはなぜですか?
バージョン情報:それは関連性がある場合には 、私が使用しています: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が浮動小数点値を最初の文字列に変換するのはなぜですか? これにはいくつかの回避策がありますか?
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 on issue](https://github.com/propelorm/Propel/issues)をチェックしたり、 – j0k
を提出してもらうことができます。私はpropelメーリングリストに質問を掲載しました。私はバグではないかもしれない場合、バグレポートを作成しないようにしたい。 – Leif