Laravel雄辩的键映射
我正在寻找一种简单的方法来更改/标准化从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',
];
如果存在像,这没什么,我会不要反对写我自己,我只是不想重新发明*,如果没有理由这样做。
您可以使用存取器来做到这一点的名字转换https://laravel.com/docs/5.4/eloquent-mutators
当然,但它似乎只是为了获取和设置值,当你只是返回为了API响应而从控制器收集的一个集合? – jacobfogg
这是官方的做法。或者,您也可以使用自己的小型转换实用程序来使用'array_map()'重命名键。不要为这个用例引入一个外部库。 –
我认为宏是你的答案。由于您正在构建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
非常有趣的答案埃迪。 –
分形! http://fractal.thephpleague.com/ –
我发现了,或者更倾向于分形,我现在正在玩它。从理论上讲,这似乎很重要。前laravel,我会刚刚做了这样的:'SELECT companyrecordid作为id,clientid作为clientId ...' – jacobfogg
好吧,没有什么能阻止你在一个雄辩select子句中指定别名,如果这是你喜欢的。 –