【问题标题】:Laravel Eloquent key mappingLaravel Eloquent 按键映射
【发布时间】:2017-07-13 03:03:41
【问题描述】:

我正在寻找一种简单的方法来更改/标准化从 Eloquent 返回的键。在这一点上,我的应用程序和数据库已经很老了。我正在构建一组新的 API 来与数据交互,但更改数据库根本不是一种选择。作为替代方案,我只想在我的选择查询上映射字段名称。

获取当前返回的给定响应:

[
    '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',
];

如果不存在这样的东西,我不会反对自己写,我只是不想在没有理由的情况下重新发明轮子。

【问题讨论】:

  • 我发现,或者更确切地说是针对分形,我现在正在玩它。对于理论上应该很简单的东西来说,它似乎很重。在 laravel 之前,我会这样做:'SELECT companyrecordid as id, clientid as clientId...'
  • 好吧,如果您愿意,没有什么可以阻止您在雄辩的 select 子句中指定别名。
  • 如果你使用的是 Laravel 5,有这个 Mappable,github.com/jarektkaczyk/eloquence/wiki/Mappable

标签: php laravel eloquent


【解决方案1】:

我认为宏是您的答案。由于您正在构建 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

【讨论】:

  • 非常有趣的回答 Eddy。
【解决方案2】:

你可以使用mutators来做这个名字转换https://laravel.com/docs/5.4/eloquent-mutators

【讨论】:

  • 当然,但是看起来mutators只是为了获取和设置值,如果你只是为了API响应而从控制器返回一个集合呢?
  • 这是官方的做法。或者,您也可以拥有自己的小型转换实用程序,使用array_map() 重命名键。不要只为这个用例引入外部库。
猜你喜欢
  • 2014-09-23
  • 2021-11-12
  • 2016-07-21
  • 2020-12-19
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多