5

ちょうど気づいたのですが、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');
4

1 に答える 1

5

問題は、Propelがその列に関連するPHPフィールドをセッターでネイティブPHPタイプに変換することです(@ j0kが言及しているように)が、もう少し深く見ると問題がわかります。PropelTypes.phpヘルパークラスの76行目で、「decimal」のネイティブPHPタイプが「string」としてリストされていることがわかります。

これを、「double」としてリストされている「float」ネイティブ型と比較してください。これが意図的なものかどうかはわかりませんが、いずれの場合も、列をtype="float"またはに切り替えるだけで問題が解決する可能性がありますtype="double"

PropelはそれをDBMSが必要とするタイプに変換する必要があります。

于 2013-03-26T14:36:07.330 に答える