2017-03-02 127 views
2

我正在使用分形(fractal.thephpleague.com)與Laravel(laravel.com)開發API。順便說一下,這是一個了不起的圖書館。Laravel +分形「深」嵌套包括

在某些Web服務中,我需要返回幾個嵌套模型的信息,這些嵌套模型有3個深度。也就是說,我有一個調查模型,其中有許多調查項目,並且他們每個人都有很多調查項目結果(每個用戶)。好吧,我需要從所有這些數據,分類,那就是:

"surveys": [ 
    { 
     "id": 1, 
     ..., 
     "items": [ 
      { 
       "id": 14, 
       ..., 
       "results": [ 
        { 
         "id": 45, 
         ... 
        }, 
        { 
         ... 
        } 
       ] 
      }, 
      { 
       ... 
      } 
     ] 
    }, 
    { 
     ... 
    } 
} 

隨着變壓器和包括我得到的調查和調查項目的信息沒有問題,但我還需要調查項目結果... 也就是我需要的東西類似2級「嵌套」包括,以獲得第三級別的信息。

到目前爲止,我的最佳做法(只返回兩個級別:調查和調查項目)。在我的控制器中:

return fractal() -> transform(
    Survey::where(...), 
    new SurveyTransformer() 
) -> include(['SurveyItems']) -> respond(); 

任何幫助,非常感謝。 在此先感謝。

+0

你有包括您ItemTransformer結果嗎? –

+0

當然可以。 – andcl

回答

2

這就是我通常做

調查變壓器

<?php 
namespace App\Transformers; 

use League\Fractal; 
use App\Survey; 

class SurveyTransformer extends Fractal\TransformerAbstract 
{ 
    /** 
    * List of resources possible to include 
    * 
    * @var array 
    */ 
    protected $availableIncludes = [ 
     'items' 
    ]; 

    public function transform(Survey $survey) 
    { 
     return [ 
      'id' => (int) $user->id, 
     ]; 
    } 


    /** 
    * Include Items 
    * 
    * @param App\Survey $survey 
    * @return League\Fractal\CollectionResource 
    */ 
    public function includeItems(Survey $survey) 
    { 
     $items = $survey->items; 
     if (!is_null($items)) { 
      return $this->collection($items, new ItemTransformer); 
     } 
     return; 
    } 
} 

項目變壓器

<?php 
namespace App\Transformers; 

use League\Fractal; 
use App\Item; 

class ItemTransformer extends Fractal\TransformerAbstract 
{ 
    /** 
    * List of resources possible to include 
    * 
    * @var array 
    */ 
    protected $availableIncludes = [ 
     'results' 
    ]; 

    public function transform(Item $item) 
    { 
     return [ 
      'id' => (int) $user->id, 
     ]; 
    } 


    /** 
    * Include results 
    * 
    * @param App\Item $item 
    * @return League\Fractal\CollectionResource 
    */ 
    public function includeResults(Item $item) 
    { 
     $results = $item->results; 
     if (!is_null($results)) { 
      return $this->collection($results, new ResultTransformer); 
     } 
     return; 
    } 
} 

在我的基本控制器

/** 
    * get fractal tranformed data 
    * @param $resource 
    */ 
    protected function fractalResponse($resource, array $includes = []) 
    { 
     $manager = new Manager(); 
     $manager->setSerializer(new DataArraySerializer()); //or what ever you like 

     if (sizeof($includes) == 0) { 
      $data = $manager->createData($resource) 
       ->toArray(); 
     } else { 
      $manager->parseIncludes($includes); 
      $data = $manager->createData($resource) 
       ->toArray(); 
     } 
     return $data; 
    } 

然後

$resource = new \League\Fractal\Resource\Collection($survies, new SurveyTransformer); 
$response_data = $this->fractalResponse($resource, ['items.results']) 
+0

感謝您的回覆,但我已經完全編寫了該結構(SurveyTransformer中的includeItems和SurveyItemTransformer中的includeResults),並且它返回的項目及其末尾都有一個名爲「items.results」的鍵,其值爲'null'。任何可能導致此行爲的想法? – andcl

+0

在itemtransformer上的includeResuts方法上添加轉儲時看到結果嗎? –

+0

好的,我在API中使用了Laravel Responder(https://github.com/flugger/laravel-responder)軟件包,看起來這個功能在軟件包中是有問題的(https://github.com/flugger/laravel-responder/issues/33)...所以我要改成另一個Laravel-fractal軟件包或試着解決這個問題,因爲到目前爲止我已經開發了很多東西來改變一切...無論如何,非常感謝你。 – andcl