我以为我会按照手册的建议将树行为用于我的菜单,但我变得越来越困惑。
我希望能够根据可以从请求对象获取的当前控制器检索菜单数据。
我想如果我有,我可以使用以下方法动态设置树行为的范围:
$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。也许这是一个因素。
干杯