如何在symfony 1.4中正确处理相关的空对象

时间:2011-08-09 08:53:44

标签: doctrine symfony-1.4

情况是我拥有带有以下YAML定义的教义实体类CategoryItem

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应增加1。为此,在doctrine实体类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似乎首先正常工作。但是,只要在处理Web请求期间多次保存类别,saveGraph也会尝试保存虚拟对象,这在语义上是错误的(至少在这种情况下)并导致错误(例如,当然没有设定名称。

现在,我的主要问题是:我做错了什么?另一个问题可能是:如何处理这些虚拟对象的相关性?但是,除此之外,我希望自动提供的成员函数get*findOneBy*返回null(而不是新创建的虚拟对象),如果没有这样的话(相关的)实体。

非常感谢任何提示 提前谢谢,
Flinsch

0 个答案:

没有答案