2016-07-15 44 views
1

好吧,我有一个简单的问题...... 我有两个表的数据库:MySQL的:请求作出JSON对象使用Array

文章(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." 
     } 
    ] 
    } 
] 

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

+0

是的。你必须让MySQL查询加入表格。通过该查询的结果,您可以在PHP中创建一个分组数组并将其作为JSON返回。 所以如果问题是'可能吗?',那么是的。如果你想了解更多技术细节,请告诉我。祝你好运! – SrAxi

+0

谢谢你的回答@SrAxi如果可以得到更多的细节(技术),这将是一种乐趣;)谢谢 –

+0

我试图做一个连接(我认为外连接),但是当我这样做时,我只对文章有一个评论...我可以提出两个请求,一个用于文章,另一个用于评论,制作一个脚本php加入他们并将其作为JSON投掷出去,但我一直在考虑在SQL中做这件事的可能性...;) –

回答

1

您可以通过左连接来获取所需的所有数据,当迭代它时,您只需要注意如何处理哪些数据。

$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)中创建方法。通过这种方式,您可以获取所有评论,而无需加载整篇文章。

+0

嗯,只是与我的好奇心,我会在稍后测试...感谢您的帮助! 这似乎很好,你真棒:) –

+0

啊btw,在德国的PHP社区,这就是所谓的“Gruppenbruch” - >“打破(进入)组”。因为您将整个数据按特定标准分成组。 http://php-de.github.io/jumpto/gruppenbruch/#beispiel-1b周围的文字是德语,但你应该检查这个简单的例子 – Philipp

+0

好吧,我会看着它...感谢您的代码,它完美的作品;) –

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) {} 

和好,那么剩下的你已经有了它,我猜...

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

+0

非常感谢;)好的,我会这么做。你是老板! –

+0

让我知道它是如何去人。选中此项:http://api.jquery.com/jquery.getjson/用于JSON处理。 – SrAxi

+0

第二个查询不应该是必需的 – Philipp