2017-02-22 12 views
0

Я ищу простой способ изменить/стандартизировать ключи, которые возвращаются из Eloquent. На данный момент мое приложение и база данных довольно старые. Я создаю новый набор API для взаимодействия с данными, но изменение базы данных просто не является вариантом. В качестве альтернативы я просто хотел бы сопоставить имена полей в моих выбранных запросах.Laravel Eloquent key mapping

Возьмите данный ответ, как это в настоящее время возвращается:

[ 
    '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

Fractal! http://fractal.thephpleague.com/ –

+0

Я нашел или, скорее, был направлен на фрактал, теперь я играю с ним. Это кажется довольно тяжелым для чего-то, что должно быть, теоретически, простым. Pre-laravel, я бы просто сделал что-то вроде: «SELECT companyrecordid как id, clientid as clientId ...» – jacobfogg

+0

Ну, нет ничего, что помешало бы вам указывать псевдонимы в предложении redoquent 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

Очень интересный ответ Эдди. –