PHP 苗条 RESTful API - 两个 Table 加入嵌套 JSON
PHP Slim RESTful API - Two Table Join Nested JSON
我目前正在使用 PHP Slim Framework 开发 RESTful API。我目前遇到以下问题:
我必须 table 具有 1:n 基数。通过 GET-Call,我想获取主 table 的数据并嵌套其中的所有 table 都带有外键。像这样:
计划结果
[{
"id":"1",
"ueberschrift":"UEBER",
"text_kurz":"Lorem ipsum...",
"kategorie":"HEAL",
"bilder":[
{"src":"wed1.png"},
{"src":"wed2.png"}
]},......
这就是我的 mysql 数据库的一部分的样子
Current databse
苗条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"
}
]
希望您知道实现此目标的正确方法!
非常感谢!
你的,
大卫
您不能 return 使用 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 和 assemble 一个数据对象,该数据对象包含查询中的列,但图像值是展开的 CSV 数组。关联数组可能是最简单的方法。
不确定 Slim 是如何做到的,但这是一个粗略的想法
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);
希望对您有所帮助。
我目前正在使用 PHP Slim Framework 开发 RESTful API。我目前遇到以下问题:
我必须 table 具有 1:n 基数。通过 GET-Call,我想获取主 table 的数据并嵌套其中的所有 table 都带有外键。像这样:
计划结果
[{
"id":"1",
"ueberschrift":"UEBER",
"text_kurz":"Lorem ipsum...",
"kategorie":"HEAL",
"bilder":[
{"src":"wed1.png"},
{"src":"wed2.png"}
]},......
这就是我的 mysql 数据库的一部分的样子 Current databse
苗条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"
}
]
希望您知道实现此目标的正确方法!
非常感谢! 你的, 大卫
您不能 return 使用 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 和 assemble 一个数据对象,该数据对象包含查询中的列,但图像值是展开的 CSV 数组。关联数组可能是最简单的方法。
不确定 Slim 是如何做到的,但这是一个粗略的想法
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);
希望对您有所帮助。