【问题标题】:yii2 insert concatenated string into database with activerecord rulesyii2 使用 activerecord 规则将连接的字符串插入数据库
【发布时间】:2016-03-09 09:32:12
【问题描述】:

我有一个表单,用户可以在其中选择一些选项,并且我想根据用户输入在 DB 中插入一个附加的连接字段。我需要在 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',但没有成功。也许我的做法是完全错误的,不能在规则中做到?请指出我正确的方向。非常感谢!

【问题讨论】:

  • 您有两个选择:第一个解决方案您可以在表单中为 concatenated 列创建隐藏字段,并在更改事件上使用 javascript 连接来自输入类型、大小、颜色的数据(可能还有其他 js 事件)这三个输入和 concatenated 隐藏字段的设置值。 第二个解决方案您可以在模型中创建连接字段值并将其结果放入concatenated 字段的方法。

标签: activerecord insert yii2 concatenation scenarios


【解决方案1】:

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

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 用于现有记录。

【讨论】:

  • 如果我这样,在这两种情况下都会这样做,对吗?
  • 如果您的案例平均值是场景,那么可以,因为基本上 ActiveRecord 有两个场景 insertupdate,直到您自己定义额外的场景
  • 有点不对劲。如果我已经在 Base 模型中覆盖了 beforeSave() 并且我的模型扩展了这个,这会不会有问题? public function beforeSave($insert) { if (parent::beforeSave($insert)) { if ($insert == true) { ... } return true; } else { return false; } } 实际上没有任何东西保存到数据库中。我已经删除了自定义场景,我现在默认了。
  • 在您的控制器中输入:if(!$model->save()) var_dump($model->getErrors()); 并调查错误
  • 这很奇怪。我在表单上注释了一个字段,Yii2 没有给出任何警告或错误消息,它只是重定向,因为一切都会好起来的。否则,您的建议有效 (beforeSave()),非常感谢您!
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
相关资源
最近更新 更多