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

yii2使用activerecord规则将连接的字符串插入数据库,activerecord,insert,yii2,concatenation,scenarios,Activerecord,Insert,Yii2,Concatenation,Scenarios,我有一个表单,用户在其中选择一些选项,我想根据用户输入在DB中插入一个附加的连接字段。我需要在场景创建(和更新)时执行此操作。例如: 我试过这样做: 型号: class Xyz extends BaseXyz { const SCENARIO_CREATE = 'create'; public function rules() { ... ['concatenated', 'generateConcatenated', 'on' => s

我有一个表单,用户在其中选择一些选项,我想根据用户输入在DB中插入一个附加的连接字段。我需要在场景创建(和更新)时执行此操作。例如:

我试过这样做:

型号:

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;
}
我认为实现这一点的最佳逻辑方法是从
规则中删除属性,并在模型中覆盖
beforeSave()

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

你应该考虑新记录和代码>更新/ <代码>现有记录的默认值<代码> INSERT < /COD>场景。< /P>你有两个选项:第一解决方案,可以为“代码”创建隐藏字段,在表格中连接“< /代码>”列,并在更改事件上使用JavaScript从输入类型、大小、颜色连接数据。(可能还有其他js活动)第二种解决方案,你可以在你的模型中创建一个方法,将字段的值连接起来,并将其结果放入

连接的
字段中。如果我不这样做,它在两种情况下都会这样做,对吗?如果你的情况是场景,那么是的,因为基本上ActiveRecord有两种方案
insert
update
,直到您定义了额外的方案。您的self有些问题。如果我已经在一个基本模型中重写了beforeSave(),并且我的模型扩展了这个方案,这是一个问题吗?
公共函数beforeSave($insert){if(parent::beforeSave($insert)){if($insert==true){…}返回true;}否则{返回false;}
实际上没有任何内容保存到数据库中。我已经删除了自定义场景,现在使用默认设置。在您的控制器中放置:
如果(!$model->save())var_dump($model->getErrors());
并调查错误这很奇怪。我在表单上注释了一个字段,Yi2没有给出任何警告或错误消息,它只是重定向,因为一切正常。否则,您的建议有效(
beforeSave()
),非常感谢!
public function beforeSave($insert)
{
    $this->concatenated = $this->type . $this->size . $this->color;
    return parent::beforeSave($insert);
}