模型访问器属性返回相关模型

时间:2018-07-02 23:59:49

标签: php laravel eloquent laravel-5.6

我有一个名为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 :(得分:1)

EquipmentType模型已包含在您的JSON输出中,因为在调用getCategoryAttribute()时将自动加载该关系。

要隐藏它,请将关系名称添加到模型上的hidden数组中。然后,在调用toArray()toJson()时将其过滤掉。

class EquipmentProfile extends Model
{
    // ...

    protected $hidden = [
        'equipmentType'
    ];

    // ...
}

答案 1 :(得分:0)

尝试在下面使用此代码:

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

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

那应该删除所有多余的变量和对象。