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

Doctrine 如何在symfony 1.4中正确处理相关的空对象,doctrine,symfony-1.4,Doctrine,Symfony 1.4,情况是,我拥有具有以下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

情况是,我拥有具有以下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 }
因此,我的类别可以按层次结构进行组织。创建新项目并将其分配给类别时,该类别和所有父类别的
项目数应增加1。为此,在条令实体类
项中
,我覆盖成员函数
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::registerWitem
只是将
items\u count
增加1

我的问题是,如果根本没有父类别,自动提供的成员函数
Category::getParentCategory
将返回一个新的虚拟对象(而不是返回
null
)。我不知道如何正确处理这些虚拟对象。成员函数
存在
首先似乎工作正常。但是,一旦在处理web请求期间多次保存类别,
saveGraph
就会尝试保存虚拟对象,这在语义上是错误的(至少在本例中是错误的),并且会导致错误(例如,名称当然没有设置)

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

非常感谢您的任何提示。
提前感谢,

Flinsch

您是否尝试过将
notnull:true
添加到
category
上的
parent\u category\u id
字段中?(你知道条令中的
NestedSet
行为吗?
notnull:true
对于
parent\u category\u id
来说是不正确的,因为根类别没有父id。我知道
NestedSet
。但是我不需要
NestedSet
的广泛功能。我的类别层次结构简单而静态。因此,除了在创建新项目时对
items\u count
进行简单更新外,不需要提供任何功能。但是,我认为实际问题不在于是否使用
NestedSet
。根据我的理解,这个问题也适用于非层次对象关系。无论如何,非常感谢。:)很抱歉我的意思是
notnull:false
。我的错。你试过添加这个吗?(事实上,使用NestedSet无法解决您的问题,尽管它通常更“性能”友好,因为它在从数据库检索数据时更高效)。但这并没有改变任何事情
notnull:false
是默认设置,我猜。我仍然会自动创建虚拟对象,而不是
null
。(我已经重建了所有内容并清除了缓存。)这可能是避免空指针异常的预期行为。但是我想知道如何正确处理那些“表示null的”虚拟对象,以及为什么要将它们保存到数据库中?我创建了一个小测试用例,这里的
getModel()
函数确实返回
null
如果
model\u id
null
。。。所以在你的分类之间的某个地方被设置。你检查过你的数据库了吗?在
父类\u id
中,数据库字段是否确实填充了
null