Cakephp 2在检索数据时使用记录的id作为索引

Cakephp 2在检索数据时使用记录的id作为索引,cakephp,indexing,find,associative-array,containable,Cakephp,Indexing,Find,Associative Array,Containable,是否可以检索索引为记录id的记录 我有一个模型,它有很多关系。因此,我的研究可以有多个文本和问题等 自定义检索函数如下所示: protected function _findStudyWithSequence($state, $query, $results=array()){ if ($state === 'before') { $query['contain'] = array( 'SubjectFilter'=>array('f

是否可以检索索引为记录id的记录

我有一个模型,它有很多关系。因此,我的研究可以有多个文本和问题等

自定义检索函数如下所示:

    protected function _findStudyWithSequence($state, $query, $results=array()){
    if ($state === 'before') {
        $query['contain'] = array(
            'SubjectFilter'=>array('fields'=>'SubjectFilter.studyCode'),
            'Text'=>array('fields'=>'Text.position,Text.id,Text.text','order'=>array('position')),
            'Image'=>array('fields'=>'Image.position, Image.id','order'=>array('position')),
            'Video'=>array('fields'=>'Video.position, Video.id','order'=>array('position')),
            'Web'=>array('fields'=>'Web.position, Web.id','order'=>array('position')),
            'Likert'=>array('fields'=>'Likert.position, Likert.id','order'=>array('position')),
            'Question'=>array('fields'=>'Question.position, Question.id','order'=>array('position')),
            'Star'=>array('fields'=>'Star.position, Star.id','order'=>array('position')),
            'Multiple_choice'=>array('fields'=>'Multiple_choice.position, Multiple_choice.id','order'=>array('position'))
        );
        $query['recursive']=-1;
        $query['order']=array('Study.started DESC');
        $query['fields']=array(
                    'Study.id', 'Study.user_id','Study.title','Study.description','Study.numberParticipants','Study.state','Study.created','Study.modified','Study.started','Study.completed','Study.numberParticipants');

        return $query;
    }

    }
    return $results;
}
array(
'Study' => array(
    'id' => '1845346986',
    'user_id' => '1402402538',
    'title' => 'bla bla',
    'description' => '',
    'numberParticipants' => '10',
    'state' => 'active',
    'created' => '2017-08-21 14:06:11',
    'modified' => '2017-08-21 14:29:56',
    'started' => '2017-08-21 14:30:06',
    'completed' => '0000-00-00 00:00:00',
),
'SubjectFilter' => array(
    'studyCode' => null
),
'Text' => array(
    (int) 0 => array(
        'position' => '0',
        'id' => '1423909242',
        'text' => '<p>Bla <b>bla </b></p><p>blub</p><p><br /></p>',
        'study_id' => '1845346986'
    )
),
'Question' => array(
    (int) 0 => array(
        'position' => '4',
        'id' => '729521908',
        'study_id' => '1845346986'
    )
), etc
正如你所看到的,我使用的是containable 结果如下所示:

    protected function _findStudyWithSequence($state, $query, $results=array()){
    if ($state === 'before') {
        $query['contain'] = array(
            'SubjectFilter'=>array('fields'=>'SubjectFilter.studyCode'),
            'Text'=>array('fields'=>'Text.position,Text.id,Text.text','order'=>array('position')),
            'Image'=>array('fields'=>'Image.position, Image.id','order'=>array('position')),
            'Video'=>array('fields'=>'Video.position, Video.id','order'=>array('position')),
            'Web'=>array('fields'=>'Web.position, Web.id','order'=>array('position')),
            'Likert'=>array('fields'=>'Likert.position, Likert.id','order'=>array('position')),
            'Question'=>array('fields'=>'Question.position, Question.id','order'=>array('position')),
            'Star'=>array('fields'=>'Star.position, Star.id','order'=>array('position')),
            'Multiple_choice'=>array('fields'=>'Multiple_choice.position, Multiple_choice.id','order'=>array('position'))
        );
        $query['recursive']=-1;
        $query['order']=array('Study.started DESC');
        $query['fields']=array(
                    'Study.id', 'Study.user_id','Study.title','Study.description','Study.numberParticipants','Study.state','Study.created','Study.modified','Study.started','Study.completed','Study.numberParticipants');

        return $query;
    }

    }
    return $results;
}
array(
'Study' => array(
    'id' => '1845346986',
    'user_id' => '1402402538',
    'title' => 'bla bla',
    'description' => '',
    'numberParticipants' => '10',
    'state' => 'active',
    'created' => '2017-08-21 14:06:11',
    'modified' => '2017-08-21 14:29:56',
    'started' => '2017-08-21 14:30:06',
    'completed' => '0000-00-00 00:00:00',
),
'SubjectFilter' => array(
    'studyCode' => null
),
'Text' => array(
    (int) 0 => array(
        'position' => '0',
        'id' => '1423909242',
        'text' => '<p>Bla <b>bla </b></p><p>blub</p><p><br /></p>',
        'study_id' => '1845346986'
    )
),
'Question' => array(
    (int) 0 => array(
        'position' => '4',
        'id' => '729521908',
        'study_id' => '1845346986'
    )
), etc
数组(
“研究”=>数组(
'id'=>'1845346986',
“用户id”=>“1402402538”,
“title”=>“bla bla”,
'说明'=>'',
“数字参与者”=>“10”,
'状态'=>'活动',
“已创建”=>“2017-08-21 14:06:11”,
“已修改”=>“2017-08-21 14:29:56”,
“开始”=>“2017-08-21 14:30:06”,
“已完成”=>“0000-00-00:00:00”,
),
“SubjectFilter”=>数组(
'studyCode'=>null
),
'文本'=>数组(
(int)0=>数组(
“位置”=>“0”,
'id'=>'1423909242',
“text'=>”Bla-Bla

blub


”, “研究id”=>“1845346986” ) ), '问题'=>数组( (int)0=>数组( “位置”=>“4”, 'id'=>'729521908', “研究id”=>“1845346986” ) )等等
但我希望文本和问题索引是ID。如下所示:

'Text' => array(
    (int) 1423909242 => array(
        'position' => '0',
        'id' => '1423909242',
        'text' => '<p>Bla <b>bla </b></p><p>blub</p><p><br /></p>',
        'study_id' => '1845346986'
    )
),
'Text'=>数组(
(int)1423909242=>阵列(
“位置”=>“0”,
'id'=>'1423909242',
“text'=>”Bla-Bla

blub


”, “研究id”=>“1845346986” ) ),

我如何管理它?

您可以使用CakePHP的惊人方法

比如:

$results['Text'] = Hash::combine($results['Text'], '{n}.id', '{n}');
$results['Question'] = Hash::combine($results['Question'], '{n}.id', '{n}');
return $results;
它不是经过测试的代码,但我相信它是正确的(或者至少很接近),您应该从这里了解这一点

有关
Hash::combine
的注释:

使用$keyPath作为构建关联数组的路径来创建关联数组 键,以及可选的$valuePath作为获取值的路径。如果 未指定$valuePath,或与任何内容都不匹配,将忽略这些值 已初始化为null。您可以选择按 在遵循$groupPath中指定的路径时获取

Hash::combine(数组$data,$keyPath,$valuePath=null,$groupPath= 空)


您可以使用CakePHP的惊人方法

比如:

$results['Text'] = Hash::combine($results['Text'], '{n}.id', '{n}');
$results['Question'] = Hash::combine($results['Question'], '{n}.id', '{n}');
return $results;
它不是经过测试的代码,但我相信它是正确的(或者至少很接近),您应该从这里了解这一点

有关
Hash::combine
的注释:

使用$keyPath作为构建关联数组的路径来创建关联数组 键,以及可选的$valuePath作为获取值的路径。如果 未指定$valuePath,或与任何内容都不匹配,将忽略这些值 已初始化为null。您可以选择按 在遵循$groupPath中指定的路径时获取

Hash::combine(数组$data,$keyPath,$valuePath=null,$groupPath= 空)


上次编辑之前它是正确的,
$results
是需要修改的,即
之后的
查找数据;)@ndm谢谢,恢复了(当然,是的,我会责怪缺少咖啡);)谢谢你的回答!这是可行的,但它需要通过所有结果进行迭代,对吗?没有类似于在模型或可包含文件中定义此内容的内容?在上次编辑之前是正确的,
$results
是需要修改的内容,即
查找数据之后的
)@ndm谢谢,回复道(当然,是的,我会责怪缺少咖啡);)谢谢你的回答!这是可行的,但它需要通过所有结果进行迭代,对吗?对于CakePHP 3,请使用,但请注意,对于CakePHP 3,请使用,但请注意