Yii - 私人领域的大规模分配

时间:2012-02-06 22:06:11

标签: php yii

TL; DR - 如何在Yii中大量分配私人字段?

StackOverflow上的任何Yii专家? YiiFramework forums并没有真正帮助我。

我的CActiveRecord模型中有一个私有字段hired,该字段依赖于另一个关系jobCount。基本上,如果至少有一个与该成员关联的有效job(存储在另一个表中),则考虑雇用它们。

传统上,我会在afterFind方法中设置hired,但这意味着每次都会加载关系。为了保存数据库查询,我只想在需要hired时加载关系。所以我将hired设置为私有,并且可以加载关系并在调用getHired()后设置它。

到目前为止一直很好......

一旦我在CGridView中加入hired字段,就会出现问题。我希望能够使用列过滤器,在“是”或“否”上使用简单的下拉过滤。在填写过滤器后,CGridView会传回一个GET请求,您将使用大量分配将其设置为已清除的模型...

$model->attributes = $_GET['ModelName'];

显然我希望hired也可以设置,尽管它是私人领域。 (我处理CGridView的搜索,不要担心。)我已经在我的模型中使它成为一个安全的字段,但它没有设置。

  • setHired()函数未被调用
  • setAttribute()函数未被调用
  • setAttributes()函数未被调用

这样做的正确方法是什么?显然,我可以在控制器动作中添加一行额外的行......

if (isset($_GET['ModelName']['hired'])) 
    $model->setHired($_GET['ModelName']['hired']);

...但我真的很想学习如何大规模分配私人字段。

我意识到这是相当复杂的。如果你看到一些方法可以简化这个hired位,我会很感激。不过,我想知道是否有办法做到这一点。

1 个答案:

答案 0 :(得分:0)

我想,您只需将属性添加到属性列表中即可。

public function attributeNames()
{
    $names = parent::attributeNames();
    $names[] = 'hired';
    return $names;
}