-1

我正在和 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]它们都是正确的并且都已填写。它只是不会覆盖amountin $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

我认为您正在对字段price,使用验证period,但对amount. 你有两种方式:

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

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

于 2013-10-22T13:06:41.257 回答
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']);
于 2013-10-22T13:24:11.640 回答
0

临时解决方案

最后我使用了以下(临时)解决方案,但很奇怪我实际上需要设置两次值才能工作:

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