2016-07-04 10 views
1

例えば、私は2つのテーブルがあります。私が欲しいネストされたJSONをデータベースから取得する最も良い方法は何ですか?

PRODUCTS (id, category_id, name); 
CATEGORIES (id, name); 

は次のようにJSONをフロントエンドに渡す:

"categoryProjects": [ 
    { 
     "id" : 1, 
     "name" : "some category name", 
     "projects": [ 
      { 
       "id": 1, 
       "name": "Product1" 
      }, 
      { 
       "id": 2, 
       "name": "Product2" 
      }, 
     [ 
    }, 
    { 
     "id" : 2, 
     "name" : "second category name", 
     "projects": [ 
      { 
       "id": 3, 
       "name": "Product3" 
      } 
     [ 
    } 
] 

私の質問は:これを行うための最善の方法は何ですか?私はできるだけ効率的にしたい。私はPHP、データベース(mysql)のシンプルなサーバーを持って、私はAPIを作成したい。フロントエンドのエンドポイントを実行する最善の方法は何か疑問に思う。あなたは、SQLを実行するために必要があると思い

+2

試してみましたか? – AkshayP

+0

あなたの研究を分かち合うことは誰にとっても役立ちます。何を試したのか、それがあなたのニーズを満たしていない理由を教えてください。これは、時間をかけて自分自身を助けようとしていることを示しています。明白な回答を繰り返さないようにしてくれています。そして、より具体的で適切な答えを得ることができます。 [ask]も参照してください。 – fracz

+0

はい、すべてのカテゴリを取得するためのエンドポイントを作成し、category_idによって製品を取得するためのエンドポイントを作成します。しかし、フロントエンドではAPIを何度も呼び出す必要があり、このソリューションは効果がないと思います。 – adfgvx

答えて

1

はそう

select products.*, categories.name as category from products left join categories on products.category_id = categories.id 

そして、PHPの配列に返されたテーブルをマッピングし、JSONに変換するように、参加します。

<?php 
$sth = $pdo->query("select products.*, categories.name as category from products left join categories on products.category_id = categories.id"); 
$rows = $sth->fetchAll(PDO::FETCH_ASSOC); 

$categories = []; 

foreach ($rows as $row) 
{ 
    if (!isset($categories[$row['category_id']])) 
    { 
     $categories[$row['category_id']] = [ 
      "name" => $row['category'], 
      "id" => $row['category_id'], 
      "products" => [] 
     ]; 
    } 

    $categories[$row['category_id']]['products'][] = [ 
     "id" => $row['id'], 
     'name' => $row['name'] 
    ]; 
} 

print json_encode($categories, JSON_PRETTY_PRINT); 

このコードは、説明したとおりに作成されたテーブルを想定して実行されます。

関連する問題