我试图用我制作的php和mysql数据库来表示这种格式的数据,下面的格式是我需要得到的:
{
"data": [
{
"id": "1",
"name": "bad boys",
"genres": [
"action",
"comedy"
]
},
{
"id": "2",
"name": "star wars",
"genres": [
"action",
"Sci-Fi"
]
},
{
"id": "3",
"name": "titanic",
"genres": "drama"
}
]
}
但我得到的是这种格式:
{
"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"
}
]
}
首先,我进行了查询以从数据库中选择电影:
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;
}
然后我编写一些代码,以便将其转换为数组:
$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')
);
}
这是我的架构 click here
我制作了这个API以便在flutter应用程序中使用它
如果有人可以帮助我
最佳答案
MySQL 5.7 添加了适当的 JSON 支持,这使得可以直接在数据库中生成您想要的结果集:
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.id
这适用于两个级别的聚合:子查询将流派数组与每部电影相关联,然后外部查询为每部电影构建一个对象,并聚合数组中的所有对象。
您将获得一个标量结果集(1 行 1 列,称为 res
),其中包含预期的 json 负载。
关于php - 使用 JSON 格式的 MYSQL 表示 PHP 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62397360/