2012-04-28 3 views

ответ

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

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-> subject должны содержать три предварительно сконфигурированных объекта + темы, связанные с партией в базе данных. Даже если в БД нет предмета для партии, то атрибут предметов должен содержать три субэлемента. Надеюсь, у вас есть мой вопрос и извините за мой плохой английский. – dInGd0nG

+0

Да, этот валидатор обеспечит включение этих конкретных предметов, но он не включает их автоматически - это не работа валидатора. Вы можете использовать функцию 'afterSave()' модели для проверки и включения дополнительных предметов, если они отсутствуют. – DCoder

+0

ok.thanks. это хорошее решение. Интересно, есть ли способ, которым три объекта не хранятся в БД, и они жестко закодированы в приложении. (так что я могу удалить избыточные записи db, поскольку эти предметы являются общими и одинаковыми для всех партий) – dInGd0nG

Смежные вопросы