ActiveRecord属性值不能被覆盖

时间:2013-10-22 12:42:05

标签: php yii http-post yii-cactiverecord

我和Yii合作。在我的控制器中,我使用以下代码用我的POST输入值更新我的模型属性值:

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

这会覆盖我的所有属性,除了一个。我无法弄清楚为什么它不会覆盖那一个。

表格结构:

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

我无法覆盖amount字段,甚至无法覆盖。是因为它是int吗?我之前没有int的问题。

我已使用var_dump()检查$foo->attributes$_POST['Foo'][$i]的内容,但这些内容都是正确的,并且都已填写。它只是不会覆盖amount in $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数组没有的字段,但它们似乎合并得很好。我应该添加这些还是不相关?

3 个答案:

答案 0 :(得分:0)

我认为您对字段priceperiod使用了验证,但对amount没有验证。你有两种方式:

  • 使用$foo->setAttributes($_POST['Foo'][$i], false) - 不推荐
  • amount添加到验证规则中:array('amount', 'safe')或更好:array('amount', 'numerical', 'integerOnly'=>false),)

OR
您在模型Foo的属性列表中没有amount

答案 1 :(得分:0)

首先检查您的方案的规则!

我认为属性是指您的一个价格金额期间属性,对吧。你可以这样做:

$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']);

答案 2 :(得分:0)

临时解决方案

最后我使用了以下(临时)解决方案,但实际上我需要在它工作之前将值设置两次是非常奇怪的:

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