Estoy tratando de representar datos en este formato con la base de datos php y mysql que hice, el siguiente formato es lo que necesito obtener:
{ "data": [ { "id": "1", "name": "bad boys", "genres": [ "action", "comedy" ] }, { "id": "2", "name": "star wars", "genres": [ "action", "Sci-Fi" ] }, { "id": "3", "name": "titanic", "genres": "drama" } ] }pero lo que obtengo es este formato:
{ "data": [ { "id": "1", "name": "bad boys", "genres": "action" }, { "id": "1", "name": "bad boys", "genres": "comedy" }, { "id": "2", "name": "star wars", "genres": "action" }, { "id": "2", "name": "star wars", "genres": "sci-fi" }, { "id": "3", "name": "titanic", "genres": "drama" } ] }Primero hice una consulta para seleccionar películas de la base de datos:
public function readMovie() { $query = 'SELECT movie.id, movie.name, genre.name as genre_name FROM movie INNER JOIN movie_genre ON movie_genre.movie_id = movie.id INNER JOIN genre ON genre.id = movie_genre.genre_id'; $stmt = $this->conn->prepare($query); $stmt->execute(); return $stmt; }luego escribo un código para poder convertirlo en una matriz:
$database = new Database(); $db = $database->connect(); $movie = new Movie($db); $result = $movie->readMovie(); $num = $result->rowCount(); if($num > 0){ $movies_arr = array(); $movies_arr['data'] = array(); while ($row = $result->fetch(PDO::FETCH_ASSOC)){ extract($row); $movie_item = array( 'id' => $id, 'name' => $name, 'genres' => $genre_name ); array_push($movies_arr['data'], $movie_item); } echo json_encode($movies_arr); } else { echo json_encode( array('message' => 'No Movie Found') ); }este es mi esquema click aqui
Hice esta api para usarla en la aplicación flutter
si alguien me puede ayudar por favor
MySQL 5.7 agregó soporte JSON adecuado, lo que hace posible generar el conjunto de resultados que desea directamente en la base de datos:
select json_arrayagg( json_object('id', m.id, 'name', m.name, 'genres', x.genres) ) res from movie m inner join ( select movie_id, json_arrayagg(name) genres from movie_genre mg inner join genre g on g.id = mg.genre_id group by movie_id ) x on x.movie_id = m.idEsto funciona con dos niveles de agregación: la subconsulta asocia una matriz de géneros a cada película, luego la consulta externa crea un objeto para cada película y agrega todos los objetos en una matriz.
Obtiene un conjunto de resultados escalares (1 fila y 1 columna llamada res ), que contiene la carga útil json esperada.