yii2使用activerecord规则将连接的字符串插入数据库
我有一个表单,用户在其中选择一些选项,我想根据用户输入在DB中插入一个附加的连接字段。我需要在场景创建(和更新)时执行此操作。例如: 我试过这样做: 型号: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
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);
}