-1

私はYiiで働いています。私のコントローラーでは、次のコードを使用して、モデルの属性値を POST 入力値で更新します。

$foo->attributes = $_POST['Foo'][$i];

これは、1 つを除くすべての属性をオーバーライドします。その単一のものをオーバーライドしない理由がわかりません。

テーブル構造:

price (decimal 11,2)
amount (int 11)
period (varchar 255)

amount手動でもフィールドをオーバーライドできません。であるからintですか?私はint以前に問題があったことはありません。

私はvar_dump()両方の内容を確認し$foo->attributes、それらは正しく、すべて入力されています。 in を$_POST['Foo'][$i]上書きしません。amount$foo->attributes

検証規則

array('period, price', 'required'),
array('amount', 'numerical', 'integerOnly'=>true),
array('period', 'length', 'max'=>255),
array('price, amount', 'length', 'max'=>10),
array('amount, period, price', 'safe', 'on'=>'search')

amount常に整数でなければなりません。テスト値は 10、20、30 でした。

問題の例

var_dump( $foo->attributes );
var_dump( $_POST['Foo'][$i] );
$foo->attributes = $_POST['Foo'][$i];
var_dump( $foo->attributes );

以下を出力します。

//$foo->attributes 
array (size=3)
  'price' => string '140.00' (length=6)
  'amount' => string '10' (length=2)
  'period' => string 'monthly' (length=6)

//$_POST['Foo'][$i]
array (size=3)
  'price' => string '150.00' (length=6)
  'amount' => string '20' (length=2)
  'period' => string 'yearly' (length=6)

//$foo->attributes after rebinding
array (size=3)
  'price' => string '150.00' (length=6)
  'amount' => string '10' (length=2)
  'period' => string 'yearly' (length=6)

そこにはいくつかの追加フィールドがあります。たとえば、モデルには$_POST配列にはないフィールドがいくつかありますが、それらはうまくマージされているようです。これらも追加する必要がありますか、それとも無関係ですか?

4

3 に答える 3

0

シナリオのルールを最初に確認してください。

属性とは、価格の期間の属性の 1 つを意味していると思います。あなたは次のようにすることができます:

$foo->setAttributes(array(
    'price' => $_POST['Foo']['price'],
    'period' => $_POST['Foo']['period'],
    'amount' => $_POST['Foo']['amount'],
));

または単に

$foo->amount = $_POST['Foo']['amount'];

更新:変更してみてください

$foo->attributes = $_POST['Foo'][$i]

$foo->setAttributes($_POST['Foo']);
于 2013-10-22T13:24:11.640 に答える
0

一時的な解決策

最後に、次の (一時的な) 解決策を使用しましたが、機能する前に実際に値を 2 回設定する必要があるのは非常に奇妙です。

$foo->attributes = $_POST['Foo'][$i];
$foo->amount = $_POST['Foo'][$i]['amount'];
于 2015-05-07T14:06:06.827 に答える
0

priceフィールド,の検証を使用していると思いますがperiodamount. あなたには2つの方法があります:

  • 使用$foo->setAttributes($_POST['Foo'][$i], false)- 推奨しない
  • amount次のように検証ルールに追加: array('amount', 'safe')、またはより良い:array('amount', 'numerical', 'integerOnly'=>false),)

または、モデルFooの属性リストにあり
ませんamount

于 2013-10-22T13:06:41.257 に答える