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

Cakephp 2 use the id of the record as index when retrieving data

是否可以检索索引为记录 ID 的记录?

我有一个具有 hasMany 关系的模型。所以我的学习可以有多个文本和问题等

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

    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;
}

如你所见,我使用的是 containable 结果如下所示:

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。像这样:

'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'
    )
),

我该如何管理?

您可以使用 CakePHP 的神奇 Hash::combine() 方法。

类似于:

$results['Text'] = Hash::combine($results['Text'], '{n}.id', '{n}');
$results['Question'] = Hash::combine($results['Question'], '{n}.id', '{n}');
return $results;

它不是经过测试的代码,但我相信它是正确的(或至少接近),你应该从这里得到这个想法。

关于 Hash::combine 的注释:

Creates an associative array using a $keyPath as the path to build its keys, and optionally $valuePath as path to get the values. If $valuePath is not specified, or doesn’t match anything, values will be initialized to null. You can optionally group the values by what is obtained when following the path specified in $groupPath.

Hash::combine(array $data, $keyPath, $valuePath = null, $groupPath = null)