У меня есть две модели. Пакет и Тема. Связь между ними - это Batch HAS_MANY Subjects. Проблема в том, что три объекта ДОЛЖНЫ и для всех партий. Как я могу реализовать эти фиксированные значения (три объекта) в модели?Yii HAS_MANY с некоторыми фиксированными значениями
0
A
ответ
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",
);
}
}
Смежные вопросы
- 1. PHP-массив с фиксированными значениями
- 2. cakephp добавление записи с некоторыми фиксированными параметрами
- 3. UISlider с некоторыми возможными значениями
- 4. Enum с некоторыми повторяющимися значениями?
- 5. Yii: ограничение отношения HAS_MANY
- 6. Использование переменной контекста с фиксированными значениями
- 7. агрегирование диапазона elasticsearch с фиксированными значениями ведер
- 8. способы заполнения n мест с фиксированными значениями
- 9. Имитировать фон: обложка; с фиксированными значениями?
- 10. Инициализировать g_hash_table с фиксированными размерами и значениями
- 11. HTML GET Form с фиксированными предопределенными значениями
- 12. Векторы с фиксированными размерами и значениями (C++)
- 13. Yii: HAS_MANY поиск
- 14. Как передать указатель функции C++ в качестве аргумента с некоторыми фиксированными значениями?
- 15. Установка бимодального гауссовского распределения с некоторыми фиксированными параметрами
- 16. Связывание источника данных с некоторыми значениями Enum
- 17. заменить NA матрицы с некоторыми значениями
- 18. Проблема pChart с некоторыми значениями данных
- 19. Инициализировать PriorityBlockingQueue с некоторыми предопределенными значениями
- 20. Неожиданное поведение в массиве с некоторыми значениями
- 21. Условный случай WHERE с некоторыми значениями NULL
- 22. Использование SortInPlace с некоторыми дополнительными значениями (ноль)
- 23. Инициализация ArrayList с некоторыми предопределенными значениями
- 24. Заменить аналогичные столбцы с некоторыми числовыми значениями
- 25. Python csv.DictWriter с dict, отсутствующим некоторыми значениями
- 26. Yii multi модель с HAS_MANY Табличная форма
- 27. Yii HAS_MANY отношение в поиске
- 28. has_many ассоциация со значениями счета
- 29. has_many: через запрос с обоими значениями
- 30. Сгенерировать образцы из таблицы частот с фиксированными значениями
Это не я хотел.и думаю, его проблема с моим вопросом. Предположим, что у меня есть $ batchModel. то $ batchModel-> subject должны содержать три предварительно сконфигурированных объекта + темы, связанные с партией в базе данных. Даже если в БД нет предмета для партии, то атрибут предметов должен содержать три субэлемента. Надеюсь, у вас есть мой вопрос и извините за мой плохой английский. – dInGd0nG
Да, этот валидатор обеспечит включение этих конкретных предметов, но он не включает их автоматически - это не работа валидатора. Вы можете использовать функцию 'afterSave()' модели для проверки и включения дополнительных предметов, если они отсутствуют. – DCoder
ok.thanks. это хорошее решение. Интересно, есть ли способ, которым три объекта не хранятся в БД, и они жестко закодированы в приложении. (так что я могу удалить избыточные записи db, поскольку эти предметы являются общими и одинаковыми для всех партий) – dInGd0nG