Doctrine 如何在symfony 1.4中正确处理相关的空对象
情况是,我拥有具有以下YAML定义的条令实体类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
类别
和项目
:
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
?