0

topic_idによって関連付けられた2つのテーブル(講義とトピック)があります。関連するトピックの子供として講義に参加する必要があります。目的のjson_encode($ result)は次のようになります。

[
    {"id":"2","name":"topic 3",
      "lectures": [
        {"id":"9", "topic_id":"2","name":"lecture 1"},
        {"id":"10","topic_id":"2","name":"lecture 2"},
        {"id":"11","topic_id":"2","name":"lecture 3"}
      ]
    },
    {"id":"3","name":"topic 4",
      "lectures": [
        {"id":"12","topic_id":"3","name":"lecture 1"},
        {"id":"13","topic_id":"3","name":"lecture 2"},
        {"id":"14","topic_id":"3","name":"lecture 3"}
      ]
    }
]

考えられる解決策の1つは、次のようにアレイを再生成することです。

$topics = $db->query("select * FROM topic")->fetchAll(PDO::FETCH_ASSOC);
$lectures = $db->query("SELECT * FROM lecture")->fetchAll(PDO::FETCH_ASSOC);

foreach($topics AS $topic) {
    $result[$topic["id"]] = $topic;
    $result[$topic["id"]]["lectures"] = array();
}
foreach($lectures AS $lecture) {
    $result[$lecture["topic_id"]]["lectures"][] = $lecture;
}

echo json_encode($result);

結果は次のとおりです。

[
    {"2": {"id":"2","name":"topic 3",
       "lectures": [    
        {"id":"9", "topic_id":"2","name":"lecture 1"},
    {"id":"10","topic_id":"2","name":"lecture 2"},
    {"id":"11","topic_id":"2","name":"lecture 3"}
   ]
    },
    {"3": {"id":"3","name":"topic 4",
       "lectures": [
    // ...
]

それはまだ私たちが必要としているものではありません。最上位のID(キーとして使用)を削除する必要があります。サーバーまたはクライアントのいずれかで、値のみを保持してresult-arrayを再生成することで実行できます。(それほどエレガントではない)解決策は次のようになります。

$result2 = array();
foreach($result AS $res) {
    $result2[] = $res;
}
echo json_encode($result2);

これで望ましい結果が得られますが、解決策は決して効率的ではありません。

これを行うためのより良い方法についての提案をいただければ幸いです。提案には、次のより効率的な方法が含まれる場合があります。

  • MySQLクエリを改善することでいくつかの作業を実行します。
  • PHPでの配列操作
  • クライアント側で操作して目的の結果を得る(Javascript、jQuery、またはUnderscoreコンビニエンスメソッド)

ありがとう

4

1 に答える 1

0

あなたの質問は少しあいまいなので、ここで推測しています。必要な MySQL ステートメントは 1 つだけだと思います。

SELECT lecture.id lid,lecture.name lname,topic.id tid,topid.name tname 
FROM lecture 
LEFT JOIN topic ON lecture.id = topic.id
ORDER BY lid,tid

結果は正しい順序になるはずです。

于 2013-03-06T11:09:29.140 に答える