情况是我拥有带有以下YAML定义的教义实体类Category
和Item
:
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