【问题标题】:MySQL : Request to make an JSON object with ArrayMySQL:请求使用数组创建 JSON 对象
【发布时间】:2016-11-18 21:15:14
【问题描述】:

好的,我有一个简单的问题... 我有一个包含两个表的数据库:

文章(id、内容、标题、日期)

评论(id_article、用户名、内容)

我想获得一个这样的 JSON 数组:

[
    {
    "id": "5785634a87c5a0075bf211de",
    "title": "Elita",
    "content": "Commodo ea enim dolor enim adipisicing ut mollit .",
    "date":"15July2016"
    "comments": [
        {
        "username": "Tran",
        "content": "Ea aliqua sit fugiat adipisicing."
        },
        {
        "username": "Noreen",
        "content": "Commodo qui ea nulla est officia. non."
        },
        {
        "username": "Gilliam",
        "content": "Esse cupidatat adipisicing sit minim."
        }
    ]
    }
]

所以我的问题......只有一个请求是否可能? :) 谢谢你

【问题讨论】:

  • 是的。您必须使 MySQL 查询加入表。使用该查询的结果,您可以在 PHP 中创建一个关联数组并将其作为 JSON 返回。因此,如果问题是“有可能吗?”,那么是的。如果您想了解更多技术细节,请告诉我。祝你好运!
  • 哇,感谢您的回答@SrAxi,如果可以获取更多详细信息(技术),那将是一种乐趣;)谢谢
  • 我尝试过加入(我认为是外部加入),但是当我这样做时,我对文章只有一个评论...我可以提出两个请求,一个用于文章,一个用于对于 cmets,制作一个脚本 php 以加入他们并将其作为 JSON 扔掉,但我正在考虑在 sql 中制作它的可能性... ;)
  • 正在努力!很快就会回答! :D

标签: php mysql sql arrays json


【解决方案1】:

最后,您需要进行 2 次查询,-.-'

这里是 PHP 代码(例如 getJSON.php):

$array = [];
$sql = 'SELECT * FROM Articles';
$q = mysql_query($sql) or die ("Error in $sql: ".mysql_error());
while ($rs = mysql_fetch_object($q)) {
    $element = [
        'id'       => $rs->id,
        'title'    => $rs->title,
        'content'  => $rs->content,
        'date'     => $rs->date,
        'comments' => [],
    ];

    $sql2 = 'SELECT * FROM Comments WHERE id_article = '.$rs->id;
    $q2 = mysql_query($sql2) or die ("Error in $sql2: ".mysql_error());
    while ($rs2 = mysql_fetch_object($q2)) {
        $comment = [
            'username' => $rs2->username,
            'content' => $rs2->content,
        ];

        $element['comments'] = $comment;
    }

    $array[] = $element;
}

echo json_encode($array);

这可能类似于 jQuery 或 Javascript 调用来获取在 php 脚本中生成的 JSON:

jQuery.getJSON('getJSON.php', {}, function (data) {}

好吧,那么剩下的我猜你已经拥有了......

希望对你有所帮助。让我知道!还有祝你好运! ;)

【讨论】:

  • 非常感谢 ;) 好的,我会这样做的。你是老板!
  • 让我知道进展如何。检查这个:api.jquery.com/jquery.getjson 用于 JSON 处理。
  • 不需要第二次查询
  • @Philipp 对于Articles 表中的每篇文章,您将如何遍历表Comments 的所有记录?用 1 个查询就可以做到这一点?
  • join 将为您提供数据集,文章本身的信息将在每个返回的行中重复,但您只需在无关紧要时使用它。获取后,您循环遍历结果集以将 cmets-data 放入数组中,在最后一次迭代之后,您可以使用最后一次迭代的 articledata 并将它们放在一起。在处理多篇文章时,您只需将该步骤放在开头并检查每次迭代是否正在处理下一篇文章。要扩展我的答案
【解决方案2】:

您可以通过 LEFT JOIN 获取所需的所有数据,在对其进行迭代时,您只需要注意如何处理哪些数据。

$lastArticleId = null;
$comments = [];
$elements = [];
$sql = 'SELECT Articles.*, Comments.content AS comment, Comments.username FROM Articles LEFT JOIN Comments ON Articles.id = Comments.id_article';
$result = $pdo->query($sql);
foreach ($result->fetchAll(PDO::FETCH_OBJ) as $dataset) {
    if($lastArticleId !== $dataset->id){
        $lastArticleId = $dataset->id;
        $elements[$lastArticleId] = [
            'id'       => $dataset->id,
            'title'    => $dataset->title,
            'content'  => $dataset->content,
            'date'     => $dataset->date,
            'comments' => [],
        ];
    }
    $comments[$lastArticleId][] = [
        'content' => $dataset->comment,
        'username' => $dataset->username,
    ];
}
foreach ($elements as $key => $article) {
    $article['comments'] = $comments[$key];
    $fullData[] = $article;
}
echo json_encode($fullData);

但是:你可以,并不意味着你应该。

将此任务拆分为两个查询更容易编写和阅读。因此,如果您以后由于某种原因需要触摸这段代码(或其他人),他会很高兴您选择了 2 查询方法。

拆分任务也是一种很好的做法,因此理想情况下,您应该在数据库访问层getAllArticles() 和另一个getCommentsByArticleId($id_article) 中创建方法。这样您就可以获取所有 cmets,而无需加载整篇文章。

【讨论】:

  • 嗯,只是出于好奇,我稍后会测试它...感谢您的帮助!看起来不错,你太棒了:)
  • 啊顺便说一句,在德国 php 社区中,这被称为“Gruppenbruch”->“打破(进入)组”;当您按特定标准将整个数据分成组时。 php-de.github.io/jumpto/gruppenbruch/#beispiel-1b 周围的文字是德语,但你应该检查这个简单的例子
  • 好的,我会看看...感谢您的代码,它运行良好;)
  • @Philipp 绝妙的方法。我总是尝试拆分任务。我总是尝试为每项任务制定一个方法。最好先发展再维护。但这里的问题是在 1 个查询中进行此操作。而你做到了。好的! ;)
猜你喜欢
  • 2020-08-01
  • 2014-10-17
  • 2013-08-28
  • 1970-01-01
  • 2017-09-18
  • 2018-07-03
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多