将动态属性添加到现有模型
当您想要在运行时向现有模型添加动态属性时。然后你需要一些自定义代码,你需要:一个模型类和一个扩展类,它将执行动态部分,并且有数组来保存动态信息。这些数组将在所需的函数中与模型类的返回数组合并。
这是一种模型,它不能完全工作。但也许你知道你需要做什么:
class MyDynamicModel extends MyNoneDynamicModel
{
private $dynamicFields = [];
private $dynamicRules = [];
public function setDynamicFields($aryDynamics) {
$this->dynamicFields = $aryDynamics;
}
public function setDynamicRules($aryDynamics) {
$this->dynamicRules = $aryDynamics;
}
public function __get($name)
{
if (isset($this->dynamicFields[$name])) {
return $this->dynamicFields[$name];
}
return parent::__get($name);
}
public function __set($name, $value)
{
if (isset($this->dynamicFields[$name])) {
return $this->dynamicFields[$name] = $value;
}
return parent::__set($name, $value);
}
public function rules() {
return array_merge(parent::rules, $this->dynamicRules);
}
}
全动态属性
当所有属性都是动态的并且您不需要数据库时。然后使用新的动态模型 http://www.yiiframework.com/doc-2.0/yii-base-dynamicmodel.htmlYii2.该文件还指出:
DynamicModel 是一个模型类,主要用于支持临时数据验证。
这里有一个完整的表单集成示例 http://www.yiiframework.com/wiki/759/create-form-with-dynamicmodel/来自 Yii2-Wiki,所以我在这里不做例子。
虚拟属性
当您想要向模型添加数据库中不存在的属性时。然后只需在模型中声明一个公共变量:
public $myVirtualAttribute;
然后您可以像其他(数据库)属性一样在规则中使用它。
To do 大量作业 http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#massive-assignment不要忘记在模型规则中添加安全规则:
public function rules()
{
return [
...,
[['myVirtualAttribute'], 'safe'],
...
];
}
其原因在这里得到了很好的解释:Yii2 非数据库(或虚拟)属性在大规模分配期间未填充? https://stackoverflow.com/a/35547796/842330