2016-05-19 13 views
1

最近、私はPDOを使用していましたPDOを使用して多数のテーブルを検索する方法

そしてhasmany関連テーブルを持つテーブルを取得したいと思います。

私はこの

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', 
     ), 
    ) 
    ) 
) 
のように、このデータを取得したいのですが、私はこの

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' 

のようなSQLクエリを使用してこの

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

のようなテーブルとテーブルを取得することができます

PDOでこのようなデータをどのように取得できますか?

ありがとう

+0

要素ごとに反復して変換する必要があるようなサウンドです。それはまだ試みた? – tadman

+0

私はまだ試していませんでした。私はそれについても考えなかった。私は純粋なSQLクエリでそれを得ることができると思った。 –

+0

SQLは2レベル構造を生成できません。常に行と列です。 – tadman

答えて

3

幸いにも、you CAN have it with PDO

ご注文の際には何も必要ありませんでしたが、使命は不可能でした。

しかし、限り、あなたは注文からのみ固有の値を必要とするように、あなたは

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

のような単純なコードでこの

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

のようなものを得ることができますしかし、私は非常にほとんど意味を参照してくださいデータをフィルタリングするために使用された同じ注文IDをフェッチする。実際のニーズに近い他のクエリにする必要がありますか?いくつかの注文をフェッチしているようなもの?

+0

いいえ私はいくつかの購入テーブルで1つの注文が必要でした。これは素晴らしいです!ありがとうございました!! –

+0

@YourCommonSenseこれはきちんとしたトリックです! – tadman

+0

@tadman日付やステータスなどでグループ化する必要があるときは、本当に便利です。 –

1

PDOではこのようにすることはできませんが、結果を並べ替えることはできます。可能な方法は、array_reduce機能を使用することです。

$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

おかげで、私はこの方法についても考えなかった。 –

関連する問題