Cakephp 2在检索数据时使用记录的id作为索引
是否可以检索索引为记录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
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-Blablub
”,
“研究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-Blablub
”,
“研究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,请使用,但请注意