0

products2つのテーブルとリレーションテーブルからこのような結果を得ることができproducts imageますか...

私はphpを使用しています。私はphpでデータを整理できますが、パフォーマンスのためにSQLを使用してこの形式でデータを取得したい.. SQL結合は知っていますが、単純な配列データが得られます。配列内の配列としてデータが必要です。

Productsテーブル:

id   name     
1    product1        
2    product2

imagesテーブル:

product_id  imageid
1           1
1           2
1           3
2           4
2           5
2           6


[0] => Array
        (
            [id] => 1
            [images] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

        )
[1] => Array
        (
            [id] => 2
            [images] => Array
                (
                    [0] => 4
                    [1] => 5
                    [2] => 6
                )
        )
4

1 に答える 1

0

いいえ、リレーショナル (SQL) データベースから直接結果として配列内の配列を取得することはできません。

結果をループして、自分で配列を作成する必要があります。

$productsById = array();

foreach ($dbRows as $row) {
    if (!isset( $productsById[$row['product_id']] )) {
        $product = array(
            'id' => $row['product_id'],
            'name' => $row['product_name']
        );
        //note the use of the & to set the $product array by reference
        $productsById[$row['product_id']] = &$product;
    }
    //note the use of the & to retrieve the $product array by reference
    else $product = &$productsById[$row['product_id']];

    $product['images'][] = array(
        'id' => $row['image_id']
    );

    //We unset this because we accessed it by reference above; this prevents referencing the wrong product
    //on the next iteration of the loop.
    unset($product);
}

または、オブジェクトの配列を取得するには:

$productsById = array();

foreach ($dbRows as $row) {
    if (!isset( $productsById[$row['product_id']] )) {
        $product = new stdClass;
        $product->id = $row['product_id'];
        $product->name = $row['product_name'];
        $product->images = array();
        $productsById[$row['product_id']] = $product;
    }
    else $product = $productsById[$row['product_id']];

    $image = new stdClass;
    $image->id = $row['image_id'];
    $product->images[] = $image;
}

ただし、MySQL を使用している場合 (およびデータベースの移植性が問題にならない場合) は、GROUP_CONCAT 関数を使用できることにも言及する価値があります。たとえば、次のようになります。

SELECT p.id as product_id, p.name as product_name, GROUP_CONCAT(i.id) as image_ids
FROM product p
LEFT JOIN image i ON p.id = i.product_id
GROUP BY p.id

次に、PHP では、製品ごとに 1 つの $row 配列のみを使用し、次を使用するだけでイメージ ID を取得できます。

$imageIds = explode(',', $row['image_ids']);
于 2013-02-25T01:53:16.427 に答える