PHP Slim RESTful API - соединение двух таблиц, вложенный JSON - PullRequest
0 голосов
/ 27 октября 2018

В настоящее время я работаю над API RESTful с PHP Slim Framework.В настоящее время я столкнулся со следующей проблемой:

У меня есть таблицы с количеством элементов 1: n.С помощью GET-Call я хочу получить данные основной таблицы и вложить туда все таблицы с внешним ключом.Как это:
Плановый результат

[{
"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"
    }
]

Надеюсь, вы знаете правильный путь для достижения этой цели!

Большое спасибо!С уважением, Дэвид

1 Ответ

0 голосов
/ 27 октября 2018

Вы не можете вернуть реляционный результирующий набор с 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 и CSV записей bild.src, которые к ней относятся.

В коде вам нужно будет разделить этот CSV и собрать объект данных, содержащий столбцы из запроса, но со значением bilder, представляющим собой массив разнесенных 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);

Надеюсь, это поможет.

...