2012-04-28 17 views
0

我有兩個模型。批次和主題。它們之間的關係是批量HAS_MANY主題。問題是三個主題都必須和所有批次。我怎樣才能在模型中實現這個固定值(三個主題)?Yii HAS_MANY與一些固定值

回答

1

如果你真的不想存儲在數據庫中的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

0

使用自定義驗證器。這應該工作,雖然它沒有經過測試。

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", 
    ); 
    } 
} 
+0

這不是我想要的,我想問題與我的問題。假設我有一個$ batchModel。那麼$ batchModel->科目必須包含三個預先配置的科目+與數據庫中的批次相關的科目。即使數據庫中沒有批次的主題,它的主題屬性也必須包含三個子目錄。希望你得到了我的問題,並對我的英語不好 – dInGd0nG 2012-04-28 14:01:07

+0

是的,這個驗證器可以確保包含那些特定的主題,但它不會自動包含它們 - 這不是驗證者的工作。您可以使用模型的'afterSave()'函數檢查幷包含其他主題(如果它們丟失)。 – DCoder 2012-04-28 14:08:48

+0

ok.t​​hanks。這是一個很好的解決方案。我想知道這三個主題沒有存儲在數據庫中,並且它們在應用程序中是硬編碼的。 (這樣我可以刪除多餘的數據庫條目,因爲這些主題對於所有批次都是通用的和相同的) – dInGd0nG 2012-04-28 14:17:46