我正在尝试使用Propel中的嵌套集创建类别层次结构。我并不特别关心左/右的东西,我只是想能够定义一个层次结构。
即使我正在寻找现有的根节点,我仍然遇到推测抱怨已存在给定范围的根节点的问题?我是Propel和嵌套模型的新手,所以我真的不确定我做错了什么。
我的表架构:
<table name="category">
<column name="id" type="integer" primaryKey="true" autoIncrement="true"/>
<column name="name" type="varchar" size="250" required="true" primaryString="true"/>
<behavior name="nested_set">
<parameter name="use_scope" value="true"/>
<parameter name="scope_column" value="scope"/>
<parameter name="left_column" value="left" />
<parameter name="right_column" value="right"/>
<parameter name="level_column" value="level"/>
</behavior>
<foreign-key foreignTable="category" onDelete="CASCADE" onUpdate="CASCADE">
<reference local="scope" foreign="id"/>
</foreign-key>
</table>
创建类别的功能:
/**
* Takes an array of category names. The first name is taken as
* the root category and then each name is a child of the preceding
* name.
*/
function createCategories(array $names) {
$categories = [];
$root = CategoryQuery::create()
->filterByName($names[0])
->filterByLevel(0)
->findOneOrCreate();
if($root->isNew()) {
$root->save();
$root->setScopeValue($root->getId());
}
$categories[0] = $root;
foreach($names as $level => $name) {
if($level == 0) {
continue;
}
$category = CategoryQuery::create()
->filterByName($name)
->filterByScope($root->getScopeValue())
->findOneOrCreate();
if($category->isNew()) {
$category->insertAsFirstChildOf($categories[$level - 1]);
}
$categories[$level] = $category;
}
return $categories;
}
答案 0 :(得分:0)
问题在于根节点的定义。我假设根节点被定义为级别为0的根节点。查看生成的代码,它实际上将根定义为其左值为1的根。
要正确地将节点定义为根,您可以调用:
$root->makeRoot()
然后这个错误就消失了。