【问题标题】:ActiveRecord attribute value cannot be overwrittenActiveRecord 属性值不能被覆盖
【发布时间】:2013-10-22 12:42:05
【问题描述】:

我正在与 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] 的内容,它们都是正确的并且都已填写。它不会覆盖$foo->attributes 中的amount

验证规则

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 数组没有的字段,但它们似乎很好地合并。我也应该添加这些还是它们无关紧要?

【问题讨论】:

  • 我建议您将字段从整数更改为小数。如果您的金额是 2.3,那么这不适用于整数。只有整数(整数),即 1,2,16,29 有效。
  • @JonPaulH 金额字段只能是整数。
  • 如果你说 $foo->amount = 10; 会发生什么? $foo->save();
  • ok,这项工作是否有效 $foo->attributes = $_POST['Foo'][$i]; $foo->金额 = 10; $foo->保存();然后请检查 $foo->attributes = $_POST['Foo'][$i]; $_POST['Foo'][$i]['amount'] = 10; $foo->amount = $_POST['Foo'][$i]['amount']; $foo->save();

标签: php yii http-post yii-cactiverecord


【解决方案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']);

【讨论】:

  • 我试过了,还是不行;不会覆盖 amount 的属性值。
  • 不,它没有。但经过一番测试,我发现$foo->attributes = $_POST['Foo'][$i]; $foo->amount = $_POST['Foo'][$i]['amount']; 确实有效。在它工作之前我需要设置两次似乎很奇怪。
  • $foo->attributes 不是用来设置值的,setAttributes() 是用来做的
  • 使用其中任何一个都没有区别。
  • (旁注:我使用 $foo->attributes 设置值,因为这是 Yii 官方文档中的说明)
【解决方案2】:

我认为您正在对字段 priceperiod 使用验证,但不是对 amount。你有两种方式:

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


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

【讨论】:

  • 在第一篇文章中添加了我当前的验证规则。
  • 我正在更新答案:将验证规则更改为array('amount', 'numerical', 'integerOnly'=>false)
  • 请在绑定后做var_dump($foo->getErrors())
  • $foo->getErrors() 输出一个空数组。
  • 很奇怪,最后-尝试将amount的验证规则更改为array('amount', 'safe')再试一次
【解决方案3】:

临时解决方案

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

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

【讨论】:

    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多