使用嵌套集的类别层次结构

时间:2015-06-14 17:22:09

标签: propel nested-sets

我正在尝试使用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;
}

1 个答案:

答案 0 :(得分:0)

问题在于根节点的定义。我假设根节点被定义为级别为0的根节点。查看生成的代码,它实际上将根定义为其左值为1的根。

要正确地将节点定义为根,您可以调用:

$root->makeRoot()

然后这个错误就消失了。