CakePHP 3:树行为的范围

时间:2015-11-19 11:15:02

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

我认为我会将树行为用于我的菜单,如手册所示,但我变得越来越困惑。

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

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

$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]);

作为树形图并且设置了范围,它实际上只返回我想要找到子节点的节点。我期望范围基于唯一值返回单个节点和子节点。在多次重读本手册之后,它现在已经沉没,它只返回包含范围值的行。除非你有一个国家层次结构(在手册的情况下)而不是像countries-> cities->地标这样的东西,否则不确定它在树数据上下文中是如何有用的。

有人可以告诉我这是否是预期的行为?

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

干杯

1 个答案:

答案 0 :(得分:0)

你必须添加作为范围的项目..

这样的东西
$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