【问题标题】:CakePHP 3: Scope in Tree behaviorCakePHP 3:树行为的范围
【发布时间】:2015-11-19 11:15:01
【问题描述】:

我以为我会按照手册的建议将 树形行为 用于我的菜单,但我变得越来越困惑。

我希望能够根据从请求对象中获取的当前控制器检索菜单数据。

我想如果有的话,我可以使用以下方法动态设置树行为的范围:

$this->behaviors()->Tree->config('scope', ['country_name' => 'France']);

我认为从那里我可以选择所有节点,例如:

$this->MyModel->find('all')

但这会返回一切。

我在手册中读到范围限制了所有操作的范围,因此这是一个令人困惑的领域。

我也试过

$this->MyModel->find('threaded') 

但这会返回所有内容。

它应该返回整棵树,这很好,因为它表明我至少完成了一部分。

真正奇怪的是:

$this->MyModel->find('children', ['for' => 1]);

只要我不设置范围,它就会完全返回我所期望的。如果我将范围设置为 id 为 1 的树,我会得到一个空数组。

所以总结一下。这是我在视图单元格中使用的代码。

$this->loadModel('MyModel');

$this->MyModel->behaviors()->Tree->config('scope', ['title' => 'MyTreeTitle']);

$this->MyModel->find('threaded')->toArray();

正如我之前所说,它返回我表中的两棵单独的树,而不仅仅是标题与定义的范围匹配的那棵。

另外,我已经手动检查了 lft 和 rght 值,以确保它们是正确的并且看起来是正确的。

非常感谢您对此的帮助,因为我非常困惑。

编辑

我做了更多的摆弄,上面的部分内容是错误的。

我输出结果

$this->MyModel->find('children', ['for' => 1]);

作为一个树列表并设置了范围,它实际上只是返回我想要为其查找子节点的节点。我希望范围根据唯一值返回单个节点和子节点。在重新阅读手册几次之后,它现在已经沉没了,它只返回包含范围值的行。除非您有国家层次结构(在手册的情况下)而不是国家->城市->地标之类的东西,否则不确定这在树数据上下文中有何用处。

谁能告诉我这是不是有意的行为?

我还应该提到我正在使用 Postgresql。也许这是一个因素。

干杯

【问题讨论】:

    标签: tree cakephp-3.0 cakephp-3.x


    【解决方案1】:

    您必须添加范围内的项目..

    有点像

    $table= \Cake\ORM\TableRegistry::get('Plugin.Table');
    $table->behaviors()->Tree->config('scope', ['Table.scope' => $scope]);
    /* where scope is the country_name or title in your case */
    $row = $table->newEntity();
    $row = $table->patchEntity($row, ['your_row_column'=>'row_column_data'])
    $table->save($row)
    

    要检索项目只需这样做

            $this->Table->find('children', [
                'contain'=>'SomethingRelated', 
                'for' => $table_row_id 
            ])->find('threaded')->toArray()
    

    #cakephprullz

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多