2012-10-11 11 views
5

Jestem w sytuacji, gdy potrzebuję wykonać bardzo duże zapytania, połączenia 25 ~ 30 w celu wygenerowania okresowych raportów.uzyskiwanie wyniku jako tablicy jednowymiarowej z zapytania cakephp

Teraz mamy już te zapytania stworzone i działające, po prostu chcę je ponownie wykorzystać iw ten sposób użyć metody zapytań typu ciasto.

powiedzieć mój kod w modelu jest tak:

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

Wynik wrócę jest jak:

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

Czy istnieje sposób mogę dostać następującą prostą strukturę Vanila od wynikowego CakePHP

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

lub stowarzyszenia tylko na poziomie kolumny, ale nie na poziomie tabeli

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

Oznaczyłeś trzy różne wersje Cake? Którego w rzeczywistości używasz? –

+0

Tak, Ben, w rzeczywistości używam wersji 2.1.2 –

Odpowiedz

1

można dostać coś podobnego za pomocą aliasów w ten sposób:

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

Pokój podkreślają __ jest ważna! Zobacz także temat: Sub-queries.

+0

Dzięki Bancer, udało mi się znaleźć to samo. to zrobić więcej z virtualFieldSeparator, Objaśni to samo co inna odpowiedź –

1

Napisz zapytanie jako View i utwórz model Cake, którego "tabela" jest tym widokiem.

Jeśli nie możesz tego zrobić, musisz po prostu powtórzyć wyniki i przekształcić je w format, który chcesz. Myślę, że znajdziesz tutaj Set class bardzo pomocny.

+0

Dzięki Ben, wydaje mi się, że będę musiał przechodzić przez siebie lub, gdy zasugerowałeś użycie Set-Class, aby zrestrukturyzować wynik, tylko martwić się, że jest to raport i zapętla się ogromny zbiór danych będzie dodatkowym kosztem, biorąc pod uwagę, że ciasto już robi podobne rzeczy podczas tworzenia. –

1

Odkopując nieco więcej w pliku MySql.php struktury Cake, istnieje metoda resultSet, która wykonuje wszystkie mapowania/powiązania.

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

Oto oświadczenie uwaga jest

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

więc jeśli nazwa kolumna zawiera virtualfieldseparator który domyślnie jest __ że kolumna dostanie związane z indeksem 0 zamiast nazwa-tabeli.

Powiązane problemy