yii2 使用 activerecord 规则将连接的字符串插入数据库

yii2 insert concatenated string into database with activerecord rules

我有一个表单,用户可以在其中选择一些选项,我想根据用户输入向数据库中插入一个附加的串联字段。我需要在 SCENARIO_CREATE 上完成(并更新)。例如:

type: A
size: 100
color: black

concatenated: A100black

我试过这样:

型号:

class Xyz extends BaseXyz {

    const SCENARIO_CREATE = 'create';

    public function rules() {
        ...
        ['concatenated', 'generateConcatenated', 'on' => self::SCENARIO_CREATE],

    ...

    public function generateConcatenated() {
        return $this->type . $this->size . $this->color;
    }

控制器:

class XyzController extends base\XyzController {

    public function actionCreate() {
        $model = new Xyz;
        $model->scenario = Xyz::SCENARIO_CREATE;
        ...

我也尝试过在规则中使用 'filter',但没有成功。也许我的做法是完全错误的,在规则上是做不到的?请指出正确的方向。非常感谢!

规则用于检查属性验证,但您也可以在规则中执行此操作:

public function generateConcatenated($attribute,$param) {
    $this->concatenated = $this->type . $this->size . $this->color;
}

我认为实现此目的的最佳逻辑方法是从 rules 中删除属性并覆盖模型中的 beforeSave()

public function beforeSave($insert)
{
    $this->concatenated = $this->type . $this->size . $this->color;
    return parent::beforeSave($insert);
}

你应该考虑到 yii 对新记录有默认的 insert 场景,对现有记录有默认的 update 场景。