Ситуация состоит в том, что у меня есть классы сущностей доктрины Category
и Item
со следующими определениями YAML:
Category:
columns:
parent_category_id: { type: integer }
name: { type: string(255), notnull: true, notblank: true }
items_count: { type: integer, notnull: true, default: 0 }
relations:
ParentCategory: { class: Category, local: parent_category_id, foreign: id }
Item:
columns:
category_id: { type: integer, notnull: true }
name: { type: string(255), notnull: true, notblank: true }
relations:
Category: { local: category_id, foreign: id }
Итак, мои категории могут быть структурированы в иерархии. При создании нового элемента и назначении его категории items_count
этой категории и всех родительских категорий следует увеличить на единицу. Для этого в классе сущностей доктрины Item
я переопределяю функцию-член save
:
function save(Doctrine_Connection $conn = null)
{
$is_new = $this->isNew();
parent::save($conn);
if ($is_new)
{
for ($category = $this->getCategory(); $category && $category->exists(); $category = $category->getParentCategory())
{
$category->registerNewItem($this);
$category->save($conn);
}
}
}
Category::registerNewItem
просто увеличивается items_count
на 1.
Моя проблема заключается в том, что автоматически предоставленная функция-член Category::getParentCategory
возвращает новый фиктивный объект (вместо возврата null
), если родительской категории вообще нет. Я не знаю, как правильно обрабатывать эти фиктивные объекты. Функция-член exists
, кажется, в первую очередь работает нормально. Но как только категория сохраняется более одного раза во время обработки веб-запроса, saveGraph
пытается также сохранить фиктивный объект, что семантически неверно (по крайней мере, в этом случае) и вызывает ошибки (например, имя не был установлен, конечно).
Теперь мой основной вопрос : Что я делаю не так? Альтернативный вопрос может быть следующим: как справиться с этими фиктивными объектами? Однако, кроме этого, я хотел бы, чтобы автоматически предоставленные функции-члены get*
, а также findOneBy*
возвращали null
(вместо вновь созданного фиктивного объекта), если такой (связанной) сущности вообще нет.
Любые советы приветствуются.
Заранее спасибо,
Flinsch