2016-05-19 5 views
1

Vor kurzem habe ich PDO wurde mit, wie eine Tabelle mit vielen Tabellen mit PDO abrufen

und ich mag einen Tisch mit hasMany bezogenen Tisch bekommen.

ich eine Tabelle mit den Tabellen wie diese

array (
    0 => 
    stdClass::__set_state(array(
    'order_id' => '170', 
    'purchase_id' => '222', 
    'product_option_id' => '014', 
)), 
    1 => 
    stdClass::__set_state(array(
    'order_id' => '170', 
    'purchase_id' => '600', 
    'product_option_id' => '015', 
)), 
) 

mit SQL-Abfrage wie diese

SELECT ord.order_id,puc.purchase_id,puc.product_option_id 
FROM order ord 
JOIN purchase puc 
ON ord.order_id = puc.order_id 
WHERE ord.order_id = '170' 

bekommen kann aber ich so

array (
    0 => 
    array(
    'order_id' => '170', 
    'purchase_id' => '222', 
    'purchase' => array(
     0 => 
     array(
      'purchase_id' => '222', 
      'product_option_id' => '014', 
     ), 
     1 => 
     array(
      'purchase_id' => '600', 
      'product_option_id' => '015', 
     ), 
    ) 
    ) 
) 
diese Daten bekommen möchten

Wie erhalten Sie die Daten mit PDO?

Danke

+0

Klingt, als ob Sie es Element für Element iterieren und transformieren müssen. Versucht das schon? – tadman

+0

Ich habe es noch nicht versucht. Ich habe nicht einmal darüber nachgedacht. Ich dachte, ich könnte es mit reiner SQL-Abfrage bekommen. –

+0

SQL kann keine zweistufige Struktur erzeugen. Es sind immer Zeilen und Spalten. – tadman

Antwort

3

Glücklicherweise you CAN have it with PDO.

Waren Sie etwas anderes als ID aus Bestellungen, die Mission war unmöglich.

Aber solange man nur eindeutigen Wert von Aufträgen benötigen, können Sie das Ding wie diese

array (
    170 => 
    array(
     0 => 
     array(
      'purchase_id' => '222', 
      'product_option_id' => '014', 
     ), 
     1 => 
     array(
      'purchase_id' => '600', 
      'product_option_id' => '015', 
     ), 
    ) 
    ) 
) 

mit so einfachen Code wie

$sql = "your sql"; 
$pdo->query($sql)->fetchAll(PDO::FETCH_GROUP); 

Doch, ich sehe sehr wenig Sinn Holen der gleichen Auftrags-ID, die zum Filtern der Daten verwendet wurde. Vielleicht sollte es eine andere Abfrage sein, die näher an Ihren tatsächlichen Bedürfnissen ist? Wie eine, die mehrere Aufträge holt?

+0

Nein Ich brauchte nur eine Bestellung mit mehreren Kauftabellen. Das ist fantastisch!!! Vielen Dank!! –

+0

@YourCommonSense Nun, das ist ein netter Trick! – tadman

+0

@tadman es kommt wirklich praktisch, wenn Sie nach Datum oder Status gruppieren müssen oder so ähnlich. –

1

Sie es nicht so mit PDO bekommen können, aber Sie die Ergebnisse neu ordnen können. Ein möglicher Weg wäre die Verwendung der array_reduce Funktion.

$orders = array_reduce($results, function ($carry, $item) { 
    if (!isset($carry[$item->order_id])) { 
     $carry[$item->order_id] = array(
      'order_id' => $item->order_id, 
      'purchase' => array(array(
       'purchase_id' => $item->purchase_id, 
       'product_option_id' => $item->product_option_id, 
      )); 
     ); 
    } else { 
     $carry[$item->order_id]['purchase'][] = array(
      'purchase_id' => $item->purchase_id, 
      'product_option_id' => $item->product_option_id, 
     ); 
    } 
    return $carry; 
}, array()); 
+1

Danke Ich habe nicht einmal über diesen Weg nachgedacht. –

Verwandte Themen