Атрибут доступа к модели, возвращающий связанную модель - PullRequest
0 голосов
/ 03 июля 2018

У меня есть модель с именем EquipmentProfile, которая имеет отношение с EquipmentProfileType, определенным так:

public function equipmentType()
{
    return $this->belongsTo(EquipmentProfileType::class, 'equipment_profile_type_id');
}

У меня есть определение доступа на EquipmentProfile, чтобы я мог получить определенное значение из этого отношения:

public function getCategoryAttribute()
{
    return $this->equipmentType->name;
}

Затем я включаю category в мой массив $appends, чтобы он включался при возврате модели в формате JSON.

Это прекрасно работает, за исключением того, что в моем ответе JSON я также получаю полное отношение к EquipmentProfileType:

//...more fields above
"category": "Brewing",
"equipment_type": {
    "id": 10,
    "name": "Brewing",
    "created_at": null,
    "updated_at": null
}

Я хочу, чтобы возвращался только category, но не объект equipment_type. Если я удаляю category из моего $appends массива, то equipment_type не включается в ответ.

Как мне вернуть category без equipment_type?

Редактировать

Мой контроллер вызывает метод в хранилище:

public function store(EquipmentProfileRequest $request)
{
    $data = $request->except(['api_token']);

    return $this->equipmentProfileRepository->store($data, $request->user());
}

Вот код репозитория ниже:

public function store(array $data, User $user)
{
    if (!array_key_exists('name', $data) || $data['name'] == '') {
        $data['name'] = 'Equipment Profile';
    }

    $data['user_id'] = $user->id;

    return $this->equipmentProfile->create($data);
}

Примечание

Даже использование tinker дает мне тот же результат:

Psy Shell v0.9.6 (PHP 7.1.7 — cli) by Justin Hileman
>>> App\Models\EquipmentProfile::first()->toJson()
=> "{... "category":"Brewing","equipment_type":{"id":10,"name":"Brewing","created_at":null,"updated_at":null}}"

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Попробуйте использовать это ниже:

$result = $this->equipmentProfile->create($data);

return response()->json($result, 200, array(), JSON_PRETTY_PRINT);

Это должно удалить любые дополнительные переменные и объекты.

0 голосов
/ 03 июля 2018

Модель EquipmentType включена в ваш вывод JSON, потому что отношение автоматически загружается при вызове getCategoryAttribute().

Чтобы скрыть это, добавьте имя отношения в массив hidden вашей модели. Затем он будет отфильтрован при вызове toArray() и toJson().

class EquipmentProfile extends Model
{
    // ...

    protected $hidden = [
        'equipmentType'
    ];

    // ...
}
...