1

モバイル アプリケーション用の API を作成しています。私はこれを PHP MYSQL と Slim フレームワーク (この問題にはほとんど関係ありません) で開発しています。

mysql データベースから複数の「会場」を取得し、「会場」ごとに複数の「venue_images」を取得しようとしています。データベース:

venues        venue_images
------        ------------
id PK         image_venue_id FK (to venues)
venue_name    image_path
active

次に、この形式でデータを出力する必要があります。

{
  "completed_in":0.01068,
  "returned":10,
  "results":[
    {
      "venue_id":"1",
      "venue_name":"NameHere",
      "images": [
         {
           "image_path":"http://www.pathhere.com"
         },
         {
           "image_path":"http://www.pathhere2.com"
         }
      ]
    }
  ]
}

基本的に、画像は会場ごとに複数回繰り返されます。

私の現在のコードは次のとおりです。

$sql = "
    SELECT
         venues.id, venues.venue_name, venues.active,
         venue_images.image_venue_id, venue_images.image_path
    FROM
         venues
    LEFT JOIN 
         venue_images ON venue_images.image_venue_id = venues.id
    WHERE
         venues.active = 1
    LIMIT 0, 10
    ";

    $data = ORM::for_table('venues')->raw_query($sql, array())->find_many();
         if($data) {
        foreach ($data as $post) {
            $results[] = array (
                 'venue_id' => $post->id,
                 'venue_name' => $post->venue_name,
                 'images' => $post->image_path
            );
        }

        //Build full json
        $time = round((microTimer() - START_TIME), 5);
        $result = array(
             'completed_in' => $time,
             'returned' => count($results),
             'results' => $results
        );
        //Print JSON
        echo indent(stripslashes(json_encode($result)));
    } else {
         echo "Nothing found";
    }

私の現在のコードは機能しますが、これを生成します:

{
  "completed_in":0.01068,
  "returned":10,
  "results":[
    {
      "venue_id":"1",
      "venue_name":"The Bunker",
      "images":"https://s3.amazonaws.com/barholla/venues/1352383950-qPXNShGR6ikoafj_n.jpg"
    },
    {
      "venue_id":"1",
      "venue_name":"The Bunker",
      "images":"https://s3.amazonaws.com/barholla/venues/1352384236-RUfkGAWsCfAVdPm_n.jpg"
    }
]
}

「The Bunker」の画像は 2 つあります。会場配列内に画像を格納する代わりに、2 番目の画像を使用して "The Bunker" の複製行を作成しています。前に述べたように、各会場内で複数の画像を繰り返す必要があります。どんな助けでも大歓迎です!ありがとう!

4

2 に答える 2

0

.. の代わりに複数のクエリを使用できないのはなぜですか? その高速かつ簡単..!

$sql = "SELECT venues.id, venues.venue_name, venues.active FROM venues WHERE venues.active = 1 LIMIT 0, 10";

    $data = ORM::for_table('venues')->raw_query($sql, array())->find_many();
         if($data) {
        foreach ($data as $post) {
            $results[] = array ();

$sql = "SELECT image_path FROM venue_images WHERE image_venue_id = $post->id"; 
$images = ORM::for_table('venue_images')->raw_query($sql, array())->find_many();

 $results[] = array (
                 'venue_id' => $post->id,
                 'venue_name' => $post->venue_name, 
                 'images' => $images);
        }

        //Build full json
        $time = round((microTimer() - START_TIME), 5);
        $result = array(
             'completed_in' => $time,
             'returned' => count($results),
             'results' => $results
        );
        //Print JSON
        echo indent(stripslashes(json_encode($result)));
    } else {
         echo "Nothing found";
    }
于 2013-01-24T12:31:49.610 に答える
0

GROUP_CONCAT を使用したい

このようなもの(おそらく100%正確ではありません:))

$sql = "
    SELECT
         v.id, v.venue_name, v.active,
         GROUP_CONCAT(i.image_path) as venue_image_string
    FROM
         venues v
    LEFT JOIN 
         venue_images i ON i.image_venue_id = v.id
    WHERE
         v.active = 1
    GROUP BY i.image_venue_id
    LIMIT 0, 10
";

少しいじる必要があるかもしれませんが、正しい軌道に乗せる必要があります (注:venue_image_string を CSV として提供します)。

于 2013-01-24T12:17:31.600 に答える