2017-02-22 72 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

非常有趣的答案埃迪。 –