2014-02-08 1 views
5

Итак, я запускаю таблицы с локализацией, но я держу строки в отдельной таблице «master».Создание чистого форматированного json с помощью сводных таблиц Laravel

Скажем, у меня есть таблица для каждого объекта:

Products 
    id 
    price 
    ... 

Перевода таблицы таблица

Translations 
    id 
    name 
    description 
    ... 

отношения

product_translation 
    product_id 
    translation_id 
    lang --enum('en', 'es', 'fr',...) 

проблема: не так довольно JSON, что приходит с этим

Так я создал BaseModel, который использует многие ко многим отношений:

public function translations() 
{ 
    return $this 
    ->belongsToMany('Translation') 
    ->where('lang', '=' App::getLocale()); 
} 

Так с этим я могу сделать Product::with('translations')->get() для моего JSON. Однако ...

То, что я хотел

{ 
    "name": "Foo", 
    "description": "Bar", 
    "price": "1000", 
    "stock": "10", 
} 

То, что я получил

{ 
    "id": "1", 
    "price": "1000", 
    "stock": "10", 
    "translations": [ 
    { 
     "id": "1", 
     "name": "Foo", 
     "description": "Bar", 
     "pivot": { 
     "product_id": "1", 
     "translation_id": "1" 
     } 
    } 
    ] 
} 

Как вы можете видеть, что есть слишком много багажа с выходом. Как я могу ограничить, какие поля я хочу создать, я хочу получить json-выход?

EDIT: Обнаружен https://github.com/laravel/framework/issues/745

Таким образом, используя $hidden я могу скрыть определенные поля. Ухоженная.

EDIT: Использование $appends с помощью метода доступа getNameAttribute() Я могу создать новое свойство для своего json. Задача решена!

+1

Было бы хорошо, если бы вы могли опубликовать свой ответ и отметьте это, как решить? Вы использовали это: http://laravel.com/docs/5.0/eloquent#accessors-and-mutators? – wiesson

ответ

0

Вы можете играть с запросами Laravel, чтобы получить только те атрибуты, которые вам нужны. См. В документации: http://laravel.com/docs/5.0/queries#selects

Что касается addind -> select(), чтобы получить только то, что вам действительно нужно.

2

То есть код, который должен быть добавлен к классу продукта (как ответ в самом вопросе):

class Product { 

    protected $hidden = ['id', 'translations']; 

    protected $appends = ['name', 'description']; 

    public function getNameAttribute() 
    { 
     return $this->translations->name; 
    } 

    public function getDescriptionAttribute() 
    { 
     return $this->translations->description; 
    } 

} 
Смежные вопросы