2012-10-11 14 views
12

Mam tabelę SQL o nazwie "marki" z identyfikatorem kolumny, nazwą, adresem URL. W tej tabeli mam ten zestaw danych:Używanie wartości kolumny jako indeksu w wynikach przy użyciu PDO

1, Solidfloor, solidfloor; 
2, Quickstep, quickstep; 
4, Cleanfloor, cleanfloor; 
5, Blue Dolphin, blue-dolphin; 
6, Krono, krono; 
8, Meister, meister; 

ja ściągam je wszystkie teraz i uzyskać ładny układ w zamian, ale muszę indeks tablic nie być zwiększana liczba, ale id tego konkretnego rzędu. Mógłbym oczywiście przejrzeć zestaw wyników, ale czy istnieje lepszy sposób na zrobienie tego?

Odpowiedz

13

Pobierz jako Assoc

do ręcznego: http://php.net/manual/en/pdostatement.fetchall.php

fetch_style

sterowania zawartość zwróconej tablicy, jak udokumentowano w PDOStatement :: pobierania(). Domyślne wartości PDO :: ATTR_DEFAULT_FETCH_MODE (domyślnie: PDO :: FETCH_BOTH)

Aby zwrócić tablicę zawierającą wszystkie wartości pojedynczej kolumny ze zbioru wyników, należy określić PDO :: FETCH_COLUMN. Możesz określić, która kolumna ma być oparta na parametrze kolumna-indeks.

Aby pobrać tylko unikalne wartości pojedynczej kolumny z zestawu wyników, bitwise-OR PDO :: FETCH_COLUMN z PDO :: FETCH_UNIQUE.

Aby zwrócić tablicę asocjacyjną zgrupowaną według wartości określonej kolumny, bitowe-OR PDO :: FETCH_COLUMN z PDO :: FETCH_GROUP.

Ten ostatni bit jest kluczem. To nie wydaje się być w pełni udokumentowane (które udało mi się znaleźć), ale zamiast PDO :: FETCH_COLUMN, można połączyć PDO :: FETCH_ASSOC z PDO :: FETCH_GROUP do osiągnięcia pożądanego rezultatu:

$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP) 

Tak biorąc pod uwagę powyższe dane:

$stmt = $PDO_obj->prepare('select * from brands'); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP); 
d($result); 

wyniku której:

array (6) [ 
    '1' => array (1) [ 
     array (2) [ 
      'name' => string (10) "Solidfloor" 
      'url' => string (10) "solidfloor" 
     ] 
    ] 
    '2' => array (1) [ 
     array (2) [ 
      'name' => string (9) "Quickstep" 
      'url' => string (9) "quickstep" 
     ] 
    ] 
    '4' => array (1) [ 
     array (2) [ 
      'name' => string (10) "Cleanfloor" 
      'url' => string (10) "cleanfloor" 
     ] 
    ] 
    '5' => array (1) [ 
     array (2) [ 
      'name' => string (12) "Blue Dolphin" 
      'url' => string (12) "blue-dolphin" 
     ] 
    ] 
    '6' => array (1) [ 
     array (2) [ 
      'name' => string (5) "Krono" 
      'url' => string (5) "krono" 
     ] 
    ] 
    '8' => array (1) [ 
     array (2) [ 
      'name' => string (7) "Meister" 
      'url' => string (7) "meister" 
     ] 
    ] 
] 

(d() znajduje się przydatny funkcji debugowania z kint bibliotece, jak var_dump() lub print_r())

Należy zauważyć, że kolumna użyta do indeksowania tablicy zawsze będzie pierwszą kolumną wyników, więc można zmodyfikować instrukcję wyboru, aby wybrać kolumnę, która ma być wybrana. Zauważ także, że indeksowana kolumna zostanie usunięta z tablicy każdego wiersza; aby to obejść, możesz dodać kolumnę dwukrotnie do instrukcji select (tj. select id, brands.* from brands itd.).

Udokumentowano tutaj więcej parametrów: http://php.net/manual/en/pdostatement.fetch.php, takich jak PDO :: FETCH_UNIQUE, aby upewnić się, że każdy indeks jest używany tylko raz.

+4

$ st-> fetchAll (PDO :: FETCH_ASSOC | PDO :: FETCH_GROUP); To wykonało zadanie, dzięki za pomoc! –

12

Mimo że opis w instrukcji PHP jest dość niejasny, w rzeczywistości jest to exact parameter you actually need.

$data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE); 

daje Ci tablicę indeksowane przez pole wymienionych w klauzuli SELECT pierwszy (kiedy * jest używany wtedy pierwsze pole w definicji tabeli, które powinny być w danym przypadku id).

Należy pamiętać, że domyślnie przy użyciu tylko PDO::FETCH_UNIQUE otrzymasz wynikowe wiersze z podwójnymi wartościami. Możesz dodać preferowany tryb wiersza do tego połączenia lub - lepiej, ustawić go raz dla wszystkich wywołań PDO w konstruktorze lub przez setAttribute(). Poniższe dane wyjściowe przedstawiono dla ustawienia PDO::FETCH_ASSOC jako domyślnego trybu pobierania.

1 => array (
    'name' => 'Solidfloor', 
    'url' => 'solidfloor', 
), 
    2 => array (
    'name' => 'Quickstep', 
    'url' => 'quickstep', 
), 
    4 => array (
    'name' => 'Cleanfloor', 
    'url' => 'cleanfloor', 
), 
) 
+1

dokładnie to, czego szukałem, dzięki –

Powiązane problemy