0

私は2つのモデルを持っています。バッチとサブジェクト。それらの間の関係は、バッチ HAS_MANY サブジェクトです。問題は、すべてのバッチで 3 つのサブジェクトが必須であるということです。この固定値 (3 つのサブジェクト) をモデルに実装するにはどうすればよいですか?

4

2 に答える 2

1

3つのデフォルトのサブジェクトをデータベースに保存したくない場合は、Batchオブジェクトに実際に関連するサブジェクトと組み合わせたデフォルトのサブジェクトを返す関数を作成できます。

あなたの関係が「主題」と呼ばれると仮定します:

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

于 2012-04-29T02:24:32.733 に答える
0

カスタム Validator を使用。テストされていませんが、これは機能するはずです。

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",
    );
  }
}
于 2012-04-28T11:36:48.777 に答える