2017-02-22 130 views
0

我正在尋找一種簡單的方法來更改/標準化從Eloquent返回的鍵。在這一點上,我的應用程序和數據庫都很老了。我正在構建一組新的API來與數據進行交互,但更改數據庫根本不是一種選擇。作爲替代方案,我只想在我的選擇查詢上映射字段名稱。Laravel雄辯的鍵映射

以給定的響應,因爲它正在返回:

[ 
    'companyrecordid': 1234, 
    'clientid': 2345, 
    'name': 'Some cool company', 
    'street_address': '1234 N. Nowhere' 
] 

期望得到的結果是:

[ 
    'id': 1234, 
    'clientId': 2345, 
    'name': 'Some cool company', 
    'streetAddress': '1234 N. Nowhere' 
] 

在一個理想的世界,這將是驚人的,如果這是爲增加那麼簡單一個變量來我的模型......是這樣的:

protected static $keymap = [ 
    'companyrecordid' => 'id', 
    'clientid' => 'clientId', 
    'street_address' => 'streetAddress', 
]; 

如果存在像,這沒什麼,我會不要反對寫我自己,我只是不想重新發明輪子,如果沒有理由這樣做。

+0

分形! http://fractal.thephpleague.com/ –

+0

我發現了,或者更傾向於分形,我現在正在玩它。從理論上講,這似乎很重要。前laravel,我會剛剛做了這樣的:'SELECT companyrecordid作爲id,clientid作爲clientId ...' – jacobfogg

+0

好吧,沒有什麼能阻止你在一個雄辯select子句中指定別名,如果這是你喜歡的。 –

回答

1

您可以使用存取器來做到這一點的名字轉換https://laravel.com/docs/5.4/eloquent-mutators

+0

當然,但它似乎只是爲了獲取和設置值,當你只是返回爲了API響應而從控制器收集的一個集合? – jacobfogg

+0

這是官方的做法。或者,您也可以使用自己的小型轉換實用程序來使用'array_map()'重命名鍵。不要爲這個用例引入一個外部庫。 –

0

我認爲宏是你的答案。由於您正在構建API,因此您將主要返回JSON響應,因此不需要在此處提供Eloquent。在視圖中不會有任何模型操作。

App/Providers創建服務。我在這裏稱之爲KeyMapServiceProvider。

namespace App\Providers; 
use Illuminate\Support\ServiceProvider; 
use Illuminate\Support\Facades\Response; 

class KeyMapServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 
     Response::macro('keymaps', function ($old) { 
      $new = (object)[ 
       'id' => $old->companyrecordid, 
       'clientId' => $old->clientid, 
       'street_address' => $old->streetAddress, 
      ]; 
      return Response::make($new); 
     }); 
    } 
} 

然後在你的應用程序

$data = DB::table('data')->get(); 
return response()->keymaps($data); 

任何地方,你可能需要調整一些東西。但大部分都在這裏。 來源:https://laravel.com/docs/5.4/responses#response-macros

+0

非常有趣的答案埃迪。 –