在CakePHP 3中对选择列表(optgroup)进行分组

在CakePHP 3中对选择列表(optgroup)进行分组,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我试图在CakePHP3中创建一个分组事物列表,在表单中的选择列表中创建一个分组事物列表。我不确定我是否错过了什么,或者我对蛋糕的期望太高了,我自己应该做得更多 我有一个名为Issues的控制器和一个名为RelatedIssues的自引用列。每个问题都属于一个系统,我希望这些问题按照这些系统进行分组 在myIssuesTable.php中: $this->belongsTo('RelatedIssues', [ 'className' => 'Issues', 'fo

我试图在CakePHP3中创建一个分组事物列表,在表单中的选择列表中创建一个分组事物列表。我不确定我是否错过了什么,或者我对蛋糕的期望太高了,我自己应该做得更多

我有一个名为
Issues
的控制器和一个名为
RelatedIssues
的自引用列。每个
问题
都属于一个
系统
,我希望这些问题按照这些系统进行分组

在my
IssuesTable.php
中:

$this->belongsTo('RelatedIssues', [
    'className' => 'Issues',
    'foreignKey' => 'issue_id'
]);

$this->belongsTo('Systems', [
    'foreignKey' => 'system_id',
    'joinType' => 'INNER'
]);
…在我的
issuecontroller
edit
方法中:

$relatedIssues = $this->Issues->RelatedIssues->find('list', [
    'groupField' => 'system_id'
]);
当我进入下拉列表时,项目按指定的
system\u id
进行分组,但我不知道如何按
system
的标题字段进行分组。这是可能的,还是我必须自己编写一个好的嵌套
foreach
结构才能做到这一点?

应该是(现在就可以尝试):

应该是(现在不能尝试):


考虑以下更清楚的问题:

$relatedIssues = $this->Issues->RelatedIssues->find('list', [
        'contain' => ['Systems'],           
        'order' => [ 'Systems.title' => 'ASC', 'RelatedIssues.title' => 'ASC'],         
        'groupField' => function($entity) {
            return $entity->system->title;              
        }
]);

考虑以下更清楚的问题:

$relatedIssues = $this->Issues->RelatedIssues->find('list', [
        'contain' => ['Systems'],           
        'order' => [ 'Systems.title' => 'ASC', 'RelatedIssues.title' => 'ASC'],         
        'groupField' => function($entity) {
            return $entity->system->title;              
        }
]);

如果我添加contain()但保留'system_id',我会得到“完整性约束冲突:1052列'title'in order子句不明确”。我完全有可能在别的地方做了些奇怪的事。看来你在什么地方加了订货条款。也许在您的一个表中,@arilia,我确实在控制器中的所有“findAll”查询上设置了order子句。我不认为这会有负面影响。但是我确实想对这个列表进行排序,有什么想法吗?我应该看看代码,但我想你只需要改变
->顺序(['title']=
->顺序(['Systems.title']=
在什么地方传递一个字段数组到你的订单子句如果我添加contain(),但保留'system\u id',我得到完整性约束冲突:order子句中的1052列“标题”不明确"。完全有可能我在其他地方做了一些奇怪的事情。似乎你在某个地方添加了一个order子句。也许在你的一个表文件中。谢谢,@arilia,我确实在控制器中的所有“findAll”查询上设置了一个order子句。我不认为这会产生负面影响。但我确实想对这个列表进行排序,知道我该怎么做吗它?我应该看到代码,但我想您只需要更改
->order(['title']=
)中的
->order(['Systems.title']=
somewhere)将字段数组传递给您的order子句