Как правильно обрабатывать связанные нулевые объекты в symfony 1.4 - PullRequest
0 голосов
/ 09 августа 2011

Ситуация состоит в том, что у меня есть классы сущностей доктрины 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

...