2012-10-11 10 views
5

Ich bin in einer Situation, in der ich einige sehr große Abfragen ausführen muss, 25 ~ 30 Joins, um einige periodische Berichte zu generieren.Ergebnis als Single-Dimension-Array von CakePHP abfragen

Jetzt haben wir bereits diese Abfragen erstellt und arbeiten, ich will nur sie wiederverwenden und damit Kuchen Methode Abfrage-Methode verwendet.

sagen in Modell ist mein Code wie:

$this->query(
    'select emp.name,mngr.designation 
    from employee emp,manager mngr 
    where manager.emp_id=emp.id' 
) 

Ergebnis ich zurück bin ist wie:

Array 
(
    [0] => Array 
     (
      [emp] => Array 
      (
       [name] => "Tom" 
      ) 
      [mngr] => Array 
      (
       [designation] => "Developer" 
      ) 
     ) 
    [1] => Array 
     (
      [emp] => Array 
      (
       [name] => "Thomas" 
      ) 
      [mngr] => Array 
      (
       [designation] => "Developer Manager" 
      ) 
     ) 
) 

Gibt es eine Möglichkeit i

die folgende Ebene vanila Struktur aus dem cakephp resultset bekommen
Array 
(
    [0] => Array 
     (
      [0]=>"Tom" 
      [1]=>"Developer" 
     ) 
    [1] => Array 
     (
      [0]=>"Thomas" 
      [1]=>"Developer Manager" 
     ) 
) 

oder Verknüpfungen nur auf Spaltenebene, aber nicht auf Tabellenebene

Array 
(
    [0] => Array 
     (
      [name]=>"Tom" 
      [designation]=>"Developer" 
     ) 
    [1] => Array 
     (
      [name]=>"Thomas" 
      [designation]=>"Developer Manager" 
     ) 
) 
+0

Sie haben drei verschiedene Kuchenversionen markiert? Welchen benutzen Sie eigentlich? –

+0

Yeah Ben, ich benutze tatsächlich Version 2.1.2 –

Antwort

1

Sie etwas ähnliches unter Verwendung von Aliasnamen auf diese Weise erhalten kann:

$this->query(
    'select emp.name AS emp__name, mngr.designation AS mngr__destination 
    from employee emp,manager mngr 
    where manager.emp_id=emp.id' 
) 

Doppel __ unterstreichen ist wichtig! Werfen Sie auch einen Blick auf Sub-queries Thema.

+0

Dank bancer, ich habe das selbe herausgefunden. es ist mehr mit VirtualFieldSeparator zu tun, wird das gleiche wie eine andere Antwort erklären –

1

Schreiben Sie Ihre Anfrage als View und erstellen Sie ein Kuchenmodell, dessen 'Tabelle' diese Ansicht ist.

Wenn Sie dies nicht tun können, müssen Sie nur Ihre Ergebnisse durchlaufen und sie in das Format konvertieren, das Sie möchten. Ich denke, Sie werden die Set class hier sehr hilfreich finden.

+0

Dank Ben, scheint wie ich Schleife durch mich selbst oder wie Sie vorgeschlagen, Set-Klasse, um das Ergebnis zu restrukturieren, nur Sorge ist, dass es ein Bericht und Schleifen für einen großen Datensatz ist Es wird zusätzliche Kosten geben, da der Kuchen bereits ähnliche Sachen macht, während er einen erstellt. –

1

Wenn ich etwas mehr in die MySql.php-Datei von Cake Framework eingrabe, gibt es eine Methode resultSet, die alle Mapping/Assoziationen durchführt.

public function resultSet($results) { 
    $this->map = array(); 
    $numFields = $results->columnCount(); 
    $index = 0; 

    while ($numFields-- > 0) { 
     $column = $results->getColumnMeta($index); 
     if (empty($column['native_type'])) { 
      $type = ($column['len'] == 1) ? 'boolean' : 'string'; 
     } else { 
      $type = $column['native_type']; 
     } 
     if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) === false) { 
      $this->map[$index++] = array($column['table'], $column['name'], $type); 
     } else { 
      $this->map[$index++] = array(0, $column['name'], $type); 
     } 
    } 
} 

Hier Aussage zu beachten ist,

if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) === false) 

so, wenn der Spaltenname ein virtualfieldseparator die standardmäßig enthält, ist __, dass Spalte mit dem Index 0 anstelle des Tabellenname zugeordnet bekommen.

Verwandte Themen