Составление JSON из БД

215
03 октября 2018, 12:20

Есть рабочий sql-запрос, по которому надо составить JSON:

$sql = "SELECT recipes.id, recipes.title_ru as 'title', detail_recipes.idIngredient, 
ingredients.title_ru as 'title' FROM recipes 
LEFT JOIN detail_recipes ON recipes.idRecipe = detail_recipes.idRecipe 
LEFT JOIN ingredients ON detail_recipes.idIngredient = ingredients.id";

Результат запроса на картинке:

Мы имеем три таблицы и у каждого рецепта есть определенное количество ингредиентов, которые берутся из остальных таблиц. Список ингредиентов нужно вывести как объект

Необходимо получить json в виде:

{
 "id":1, 
 "title": "Американские блины",
 "ingredients": [
   {
    "idIngredient":1,
    "title":"Молоко"
   },
   {
    "idIngredient":20,
    "title":"Куриное яйцо"
   },
   {
    "idIngredient":27,
    "title":"Сахар"
   },
  ...
 ]
 "id":2, 
 "title": "Сырники из творога",
 "ingredients": [
   {
    "idIngredient":13,
    "title":"Творог"
   },
   {
    "idIngredient":20,
    "title":"Куриное яйцо"
   },
   {
    "idIngredient":27,
    "title":"Сахар"
   },
  ...
 ] 
}

Как это правильно вывести на языке php? Вот что есть:

if (!$result = $mysqli->query($sql)) {
        echo "Error!";
        echo "\nQuery: " . $sql . "\n";
        echo "ErrorNo: " . $mysqli->errno . "\n";
        echo "Error: " . $mysqli->error . "\n";
        exit;
    }
    if ($result->num_rows === 0) {
        echo "Result is empty";
        exit;
    }
    $data = array();
    while($row = $result->fetch_assoc()) { 
        $data[] = $row; 
    }
    echo json_encode($data,JSON_UNESCAPED_UNICODE);

Но результат выводит этот:

[
 {
  "id":"1",
  "title":"Американские блины",
  "idRecipe":"1"
 },
 {
  "id":"2",
  "title":"Сырники из творога",
  "idRecipe":"2"
 }
]

Спасибо за помощь.

Answer 1

Ну во-первых, я не знаю как вам СуБД вернула 2 одинаковых поля, но пхп такое точно объединит, поэтому первое что надо сделать, переименовать второй title в IngredientTitle. В запросе: ingredients.title_ru as 'IngredientTitle'

$array = [
    0    => array(
        'id'                 => '1',
        'title'              => 'TITLE 1',
        'idIngredient'       => '15',
        'IngredientTitle'    => 'Ingredient 1',
    ),
    1    => array(
        'id'                 => '1',
        'title'              => 'TITLE 1',
        'idIngredient'       => '26',
        'IngredientTitle'    => 'Ingredient 2',
    ),
    2    => array(
        'id'                 => '2',
        'title'              => 'TITLE 2',
        'idIngredient'       => '11',
        'IngredientTitle'    => 'Ingredient 3',
    ),
];
$result = array();
//while($value = $result->fetch_assoc()) {
foreach ($array as $value)
{
    $result[$value['id']]['id']              = $value['id'];
    $result[$value['id']]['title']           = $value['title'];
    $result[$value['id']]['ingredients'][]   = ['idIngredient' => $value['idIngredient'], 'title' => $value['IngredientTitle']];
}
var_dump(json_encode(array_values($result), JSON_UNESCAPED_UNICODE));

Результат будет таков:

[  
    {  
        "id":"1",
        "title":"TITLE 1",
        "ingredients":[  
            {  
                "idIngredient":"15",
                "title":"Ingredient 1"
            },
            {  
                "idIngredient":"26",
                "title":"Ingredient 2"
            }
        ]
    },
    {  
        "id":"2",
        "title":"TITLE 2",
        "ingredients":[  
            {  
                "idIngredient":"11",
                "title":"Ingredient 3"
            }
        ]
    }
]
Answer 2

Запросом получаешь массив с данными. А массив передаешь в функцию json_encode($data).

Пример:

oci_execute($stid, OCI_NO_AUTO_COMMIT);
$data= array();
while(($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) !== FALSE) {
    //тут второй запрос по ингридиентам
    //...
    while(($row2 = oci_fetch_array($stid2, OCI_ASSOC+OCI_RETURN_NULLS)) !== FALSE) {
        $row['ingredients'] = $row2;
    }
    $data[] = $row;
}
oci_cancel($stid);
echo @json_encode($data)
READ ALSO
Прикрепить изображение к посту, VK API

Прикрепить изображение к посту, VK API

Не выходит прикрепить изображение к посту в группеПо порядку: определяю путь к пикче, передаем в метод getWallUploadServer айди группы без минуса и токен

174
google ReCaptcha во время парсинга данных

google ReCaptcha во время парсинга данных

Делаю инструмент для удобства работы с неким сторонним сайтом, на одном из этапов столкнулся с проблемой, при авторизации через CURL, на стороннем...

170
Как написать свой планировщик задач?

Как написать свой планировщик задач?

У меня есть скрипт, мне нужно чтоб он срабатывал два раза в деньКак на php написать, чтоб этот скрипт так работал?

151
Парсить div с изображениями

Парсить div с изображениями

Подскажите, нужно спарить div в котором находятся изображения(т

147