检查列表中的一个属性是否已设置

时间:2015-06-23 13:05:02

标签: php yii yii2

我有一个像这样的模型

class Person extends yii\db\ActiveRecord
{
  public $desk_no;
  public $mobl_no;
  public $faxx_no;
}

我想添加一个验证规则,用英语读取这样的内容

  

其中一个* _no属性是必需的;我不在乎哪一个。

我如何在中解决这个问题?

2 个答案:

答案 0 :(得分:2)

有点黑客但你可以使用条件验证所需的验证器:

public function rules() {
    $oneOfUs = ['desk_no', 'mobl_no', 'faxx_no'];
    return [
        ... //Your other rules here
        [$oneOfUs, 'required', 'when' => function($model, $attribute) use ($oneOfUs) {
            foreach (array_diff($oneOfUs, [$attribute]) as $f) {
                return !!($model->$f);
            }
            return false;
        }]
    ];
}

上面的代码有效,因为如果设置了除当前属性之外的任何属性,条件函数将返回true。这将依次在当前属性上运行required验证器。

答案 1 :(得分:1)

您可以使用此类验证,例如

['desk_no', 'required', 'when' => function($model) {
    return is_null($model->mobl_no)&&is_null($model->faxx_no);
}, message => "One of the *_no attributes is required; I don't care which one." ],

但是如果这个逻辑可以改变,我更喜欢自定义验证器