Php Yii有很多固定值

Php Yii有很多固定值,php,yii,Php,Yii,我有两个模型。批次和主题。它们之间的关系是多学科的。问题是所有批次都必须有三个主题。如何在模型中实现此固定值(三个主题)?使用自定义验证器。这应该是可行的,尽管还没有经过测试 class RelatedObjAttrRangeValidator extends CValidator { public $relationName; public $relatedObjectAttributeName; public $relatedObjectValues = array();

我有两个模型。批次和主题。它们之间的关系是多学科的。问题是所有批次都必须有三个主题。如何在模型中实现此固定值(三个主题)?

使用自定义验证器。这应该是可行的,尽管还没有经过测试

class RelatedObjAttrRangeValidator extends CValidator {
  public $relationName;
  public $relatedObjectAttributeName;
  public $relatedObjectValues = array();

  public function validateAttribute($object, $attribute) {
    if(!$this->relationName) {
      $this->relationName = $attribute;
    }
    if(!$this->relatedObjectAttributeName || !count($this->relatedObjectValues)) {
      throw new CException("Misconfigured Validator!");
    }

    $relatedObjects = $object->getRelated($this->relationName);
    if(is_array($relatedObjects)) {
      $unmatched = array_values($this->relatedObjectValues);
      $attr = $this->relatedObjectAttributeName;
      foreach($relatedObjects as $relObj) {
        $val = $relObj->$attr;
        $idx = array_search($val, $unmatched);
        if($idx !== -1) {
          unset($unmatched[$idx]);
        }
        if(!count($unmatched)) {
          break;
        }
      }
      if(count($unmatched)) {
        $object->addError($attribute, $this->message);
      }
    } else {
      throw new CException(Yii::t('error', 'Relation {rel} in model {model} is not an array!', array(
        '{rel}' => $this->relationName,
        '{model}' => get_class($model),
      ));
    }
  }
}

class Batch extends CActiveRecord {
  public function rules() {
    return array(
      array('subjects', 'RelatedObjAttrRangeValidator', 
        'relatedObjectAttributeName' => 'ID',
        'relatedObjectValues' => array("required_id_1", "required_id_2", "required_id_3"),
        'message' => "One or more required Subjects are missing",
    );
  }
}

如果确实不想在数据库中存储3个默认主题,可以编写一个函数,将默认主题与实际与批处理对象相关的任何主题组合起来返回

假设你的关系被称为“主体”:

class Batch extends CActiveRecord
{
  ...
  public function getAllSubjects()
  {
    $subject1 = new Subject;
    ...
    $subject2 = new Subject;
    ...
    $subject3 = new Subject;
    ...
    return array($subject1, $subject2, $subject3) + $this->subjects;
  }

限制是您不能引用数据库条件中的默认主题,您必须确保使用
$model->allSubjects
而不是
$model->subjects

这不是我想要的。我想这是我的问题。假设我有一个$batchModel。然后$batchModel->subjects必须包含三个预配置的subjects+与数据库中的批次相关的subjects。即使数据库中没有批次的主题,主题属性也必须包含三个子部分。希望你明白我的问题,并为我糟糕的英语道歉,这个验证器将确保包括那些特定的主题,但它不会自动包括它们-这不是验证器的工作。您可以使用模型的
afterSave()
函数来检查并包括缺少的其他主题。好的,谢谢。这是一个很好的解决办法。我想知道有没有办法不把这三个主题存储在数据库中,而把它们硬编码在应用程序中。(这样我就可以删除冗余的db条目,因为这些主题对于所有批次都是公共的和相同的)