php slim restful api-两表连接嵌套json

euoag5mw  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(284)

我目前正在使用php slim框架开发restfulapi。我当前遇到以下问题:
我必须选择基数为1:n的表。通过get调用,我想获取主表的数据,并在其中嵌套所有带有外键的表。这样地:
计划结果

[{
"id":"1",
"ueberschrift":"UEBER",
"text_kurz":"Lorem ipsum...",
"kategorie":"HEAL", 
"bilder":[
    {"src":"wed1.png"},
    {"src":"wed2.png"}
 ]},......

这就是mysql数据库的一部分看起来像当前数据库的方式
瘦php代码

$app->get('/rezensionen', function ($request, $response, $args) {
        $sth = $this->db->prepare("SELECT 
rezension.id,ueberschrift,text_kurz,kategorie, bild.src FROM rezension INNER 
JOIN bild ON (rezension.id=bild.rezension_id)");
        $sth->execute();
        $todos = $sth->fetchAll();
        return $this->response->withJson($todos);
});

我得到的是:
实际结果

[
    {
        "id": "1",
        "ueberschrift": "UEBER",
        "text_kurz": "Lorem Ipsum...",
        "kategorie": "HEAL",
        "src": "wed1.png"
    },
    {
        "id": "1",
        "ueberschrift": "UEBER",
        "text_kurz": "Lorem Ipsum...",
        "kategorie": "HEAL",
        "src": "wed2.png"
    }
]

希望你知道一个正确的方法来实现这一点!
谢谢!你的,大卫

irlmq6kh

irlmq6kh1#

您不能使用sql返回关系结果集,因此您需要做更多的工作才能获得该输出。
如果将查询更改为

SELECT 
    rezension.id
   ,ueberschrift
   ,text_kurz
   ,kategorie
   ,GROUP_CONCAT(bild.src) AS bilderCSV
FROM 
    rezension 
INNER JOIN bild 
    ON rezension.id = bild.rezension_id 
GROUP BY 
    rezension.id

然后,您将获得每个rezension.id的一条记录以及与其相关的bild.src记录的csv。
在代码中,您将需要拆分该csv并组装一个数据对象,该对象包含来自查询的列,但bilder值是分解的csv的数组。关联数组可能是最简单的方法。
不知道斯利姆是怎么做到的,但这里有一个粗略的想法

foreach($todos as $todo) {
    $output['id'] = $todo->id;
    $output['ueberschrift'] = $todo->ueberschrift;
    $output['text_kurz'] = $todo->text_kurz;
    $output['kategorie'] = $todo->kategorie;

    $srcs = explode(",", $todo->bilderCSV);
    foreach($srcs as $src) {
        $output['bilder'][]['src'] = $src
    }

    $outputs[] = $output
}

return $this->response->withJson($outputs);

希望这有帮助。

相关问题