从三个表获取关系结果到一个嵌套数组

时间:2015-09-27 17:55:42

标签: php


我已经谷歌搜索解决我的问题,但尼姑帮助了我。 这里我有三个表itemsfeedsimages。每个项目都有一个Feed和一个或多个图片。  我有3个功能。一个是从items表返回记录,第二个接收到feeds_id(items表中的外键),然后从feeds表返回记录。第三个功能是返回与items_id相关的所有图像。

这些功能是:
*获取数据库中的所有项目:

 function get_items(){
  return  $query = Database::getInstance('db')
        ->table('items')
        ->columns(
            'id',
            'items.rowid',
            'items.feed_id as feed_id',
            'title' )
        ->findAll();
}


*从Feed表中获取Feed数据:

function get_feeds($id){
   return  $query = Database::getInstance('db')
        ->table('feeds')
        ->eq('id',$id)
         ->findAll();
}


*从图像表中获取图像数据:

function get_images($id){
   return  $query = Database::getInstance('db')
        ->table('images')
        ->columns('items_id','src as image_url',
            'title as image_title',
            'alt')
        ->eq('items_id',$id)
        ->findAll();
   }

然后我有以下代码来调用这些函数并在jsonformat中显示结果:

  $response['items'] = array();
  $response['feeds'] = array();
  $response['images'] = array();   

  foreach ($items = get_items() as $item) {

      $response['items'][] = array(
            'id' => (int)$item['rowid'],
            'feed_id' => (int)$item['feed_id'],
            'title' => $item['title'],
       );

      foreach ($feeds = get_feeds((int)$item['feed_id']) as $feed) {

         $response['feeds'][] = array(
            'title' => $feed['title'],
            'logo_url' => $feed['logo_url'],
            'site_url' => $feed['site_url'],
          );
        }

       foreach ($images = get_images($item['id']) as $image) {

         $response['images'][] = array(
            'id' => $image['items_id'],
            'url' => $image['image_url'],
            'thumb' =>  $_SERVER['SERVER_NAME'] . /myServer/images/thumbs/'. 'thumb_'.basename($image['image_url']),
             'title' => $image['image_title'],
             'alt' => $image['alt']
                );
            }
        }

        echo json_encode($response, JSON_PRETTY_PRINT);

所以,我的期望是获得json输出:

"items": [
        {
            "id": ,
            "feed_id": 
            "title":
            "feeds": [
                      {
                       "title": ,
                       "logo_url": ,
                       "site_url": "
                      }
                    ]
             "images": [
                         {
                          "id": ,
                          "url": ",
                          "thumb": 
                          "title": "",
                          "alt": ""
                         },
                         {
                          ....
                          }
                        ] 
        }]

我的意思是每个项目数组应该包含来自get_feeds和get_images函数的相关数据的嵌套数组。    而不是那样,我得到的答案如下:

//here i select two items from my db
    "items": [
                { //first_item
                    "id": ,
                    "feed_id": 
                    "title":
                 },
                 { //second_item
                    "id": ,
                    "feed_id": 
                    "title":
                 }
              ],
       "feeds": [
                   { // feed data for first item
                     "title": ,
                      "logo_url": ,
                      "site_url": "
                   },
                   { // feed data for second item
                     "title": ,
                      "logo_url": ,
                      "site_url": "
                   }
               ],
                     "images": [
                                 { // image data for first item
                                  "id": ,
                                  "url": ",
                                  "thumb": 
                                  "title": "",
                                  "alt": ""
                                 },
                                 { // other images data 
                                  ....
                                  }
                                ] 
                }]

如您所见,我在不保持项目,Feed和图像之间关系的情况下获得输出,所有这些都是独立显示的。

我的查询很好,但我怀疑foreach语句中的错误。

我可以通过在一个查询中加入这些树表来解决这个问题,但我不想这样做,因为我需要进行验证,其他操作来自每个表的输出。 我感谢你的帮助

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。这很容易:)

就像:

 $response['items'][] = array(
            'id' => (int)$item['rowid'],
            'feed_id' => (int)$item['feed_id'],
            'title' => $item['title'],
            'feeds' => array(
             )
          'images' => array(
          )
   );