php - 使用 JSON 格式的 MYSQL 表示 PHP 中的数据

标签 php mysql arrays json select

我试图用我制作的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/

相关文章:

php - Laravel 模型事件 - 我对它们的去向有些困惑

javascript - 如何为 Woocommerce 中的变体选项强制设置 "selected"属性?

mysql - 如何复制字段?

javascript - 如何将 JSON 数组转换为 Javascript 数组?

javascript - 实现打开/关闭标签功能的最佳方式

mysql - 查找30M记录表中的重复列

c# - 在 Azure 中设置 MySQL 后端以进行 Xamarin 离线同步

php - 使用函数访问 PHP 数组元素?

Ruby 可枚举反向检测

javascript - 表单 Action onclick 无需使用 Ajax 刷新