【问题标题】:Sort tree by title Gedmo Tree Symfony按标题排序树 Gedmo Tree Symfony
【发布时间】:2016-02-21 14:21:26
【问题描述】:

我想按名称排序显示我的类别树。我有一个 CategoryType 来创建新的 Category 实体并使用选择框为其分配父 Category。这是我的表单类型:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', TextType::class, array("required" => false));
    $builder->add('parent', EntityType::class, array(
        'class' => 'CAPShopAdminBundle:Category',
        'choice_label' => 'selectBoxName',
        'placeholder' => '-- Aucune --',
        'required' => false,
        'query_builder' => function(NestedTreeRepository $r) {
            return $r->createQueryBuilder('c')
                ->orderBy('c.root, c.lvl, c.name', 'ASC');
        }
    ));
    $builder->add('save', SubmitType::class);
}

结果如下:

我搜索这个结果:

是否可以不使用 PHP 处理,只使用良好的 SQL 查询?

【问题讨论】:

  • 我认为你只需要多点订单就可以了。
  • 嗯,正如我所说,我已经尝试了我所知道的一切......
  • 你确定->orderBy('c.root, c.lvl, c.name', 'ASC'); 是正确的吗?你试过没有c.lvl,比如->orderBy('c.root, c.name', 'ASC');吗?
  • c.lvl 是确保节点层次结构所必需的。

标签: php symfony doctrine-orm tree


【解决方案1】:

我想我已经找到了解决办法。我已经从一个且唯一的根节点开始重建我的树。这种结构更好,然后,当我在树中插入一个节点时,我从 Gedmo 树 Bundle 中执行 reorder() 函数。

    /**
 * @param Category $category
 */
public function saveCategory(Category $category)
{

    if(!$category->getId()){ //insert
        $this->objectManager->persist($category);
        $this->objectManager->flush();

        $root = $this->categoryRepository->findOneBySlug('pieces-automobile'); //The root node
        $this->categoryRepository->reorder($root, 'name', 'ASC'); //Reoder by name
    }

    $category->setSlug($category->getId().'-'.$this->miscellaneous->slugify($category->getName(),'-'));

    $this->objectManager->flush();

}

我的树会很小,最多可能有 30 个节点。因此,每次插入节点时,我都可以重新编码树。但要小心,因为 reorder() 是一个繁重的函数,它可能需要一些时间来处理大树。

我得到了没有根的树:

    /**
 * @return bool
 */
public function getAllCategories(){

    $root = $this->categoryRepository->findOneBySlug('pieces-automobile');

    $htmlTree = $this->categoryRepository->childrenHierarchy(
        $root, /* starting from root nodes */
        false, /* true to take only direct children */
        array(
            'decorate' => true,
            'representationField' => 'name',
            'html' => true,
        )
    );

    return $htmlTree;
}

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2018-12-12
    • 2020-02-18
    相关资源
    最近更新 更多