2017-08-25 3 views
0

Ist es möglich, Datensätze abzurufen, wo der Index die Datensatz-ID ist?CakePHP 2 Verwenden Sie die ID des Datensatzes als Index beim Abrufen von Daten

Ich habe ein Modell mit einer hasMany Relation. So kann meine Studie mehrere Texte und Fragen usw.

Die benutzerdefinierte Funktion abrufen wie folgt aussieht:

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

Wie Sie sehen Ich bin mit contain Die Ergebnisse sehen wie folgt aus:

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 

Aber ich möchte, dass der Text und der Frage-Index die IDs sind. Gefällt mir:

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

Wie kann ich das schaffen?

Antwort

2

Sie können die erstaunliche Hash::combine() Methode von CakePHP verwenden.

Etwas wie:

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

Es Code nicht getestet, aber ich glaube, dass es richtig ist (oder zumindest in der Nähe), und Sie sollten die Idee von hier.

Hinweise zu Hash::combine:

Erzeugt ein assoziatives Array ein $ keyPath als Pfad mit seinen Schlüssel zu bauen, und optional $ valuePath als Pfad die Werte zu erhalten. Wenn $ valuePath nicht angegeben ist oder mit nichts übereinstimmt, werden die Werte mit null initialisiert. Sie können die Werte optional gruppieren, indem Sie erhalten, wenn Sie dem in $ groupPath angegebenen Pfad folgen.

Hash :: kombinieren (array $ data, $ keyPath, $ valuePath = null, $ GroupPath = null)

+1

Es war richtig, bevor Sie zuletzt, '$ results' ist, was geändert werden muss , dh die 'nach' Daten finden;) – ndm

+0

@ndm danke, rückgängig gemacht (und ja, natürlich. Ich werde Mangel an Kaffee beschuldigen);) – Dave

+0

Danke fürs Beantworten! Das wird funktionieren, aber es braucht eine Iteration durch alle Ergebnisse, oder? Es gibt nicht so etwas wie das Definieren in einem Modell oder in dem Containable? –

Verwandte Themen