Laravel аксессоры дают объекту json информацию дважды - PullRequest
1 голос
/ 02 мая 2020

Итак, у меня есть модель с именем product. Этот продукт имеет внешний ключ к процессору (cpu_id), который является другой моделью, и содержит всю информацию о процессоре. При приведении этой модели (продукта) к объекту JSON я получаю только cpu_id вместо всей информации о процессоре (я уже определил отношение, и оно работает). Поэтому я создал аксессор cpu_details. Теперь, когда я приведу продукт к json, я получу информацию об удвоенном процессоре: из процессора и недавно определенном cpu_details. Почему это происходит? Есть ли способ для json автоматически получать информацию о процессоре?

Модель моего продукта

 class Product extends Model
{
    protected $table = 'product';
    protected $appends = ['cpu_details'];

    public function getCpuDetailsAttribute()
    {
        return $this->cpu;
    }

    public function cpu()
    {
        return $this->belongsTo('App\Specs\CPU');
    }
}

Мой продукт при преобразовании в json (с использованием to Json () функция) без аксессора, обратите внимание, что я получаю только cpu_id, но не сам процессор, но он получает информацию о других отношениях, таких как скидки (другая модель).

{id: 18, 
stock: 10,
cpu_id: 2,
discounts: Array(1)
0: {id: 5, val: "0.5", begindate: "2019-07-04", enddate: "2021-07-16"}
length: 1
__proto__: Array(0)
}

Теперь это то, что Я получаю, когда я передаю json с помощью аксессора, теперь я получаю информацию дважды

{id: 19, 
stock: 10
cpu: {id: 2, freq: "12", cores: 4, threads: 8, name: "Apple A12Z Bionic"}
cpu_details: {id: 2, freq: "12", cores: 4, threads: 8, name: "Apple A12Z Bionic"}
cpu_id: 2
discounts: discounts: Array(1)
0: {id: 4, val: "0.4", begindate: "2018-06-14", enddate: "2021-06-18"}
length: 1
__proto__: Array(0)


1 Ответ

0 голосов
/ 02 мая 2020

Для доступа к cpu_details вам нужно загрузить отношение cpu, которое будет прикреплено к вашему объекту Product. Если вам нужны только данные о процессоре, вам нужно загрузить отношения и вызвать объект вашего продукта следующим образом:

Product::with('cpu')->get();

Теперь, если по какой-то причине вы действительно хотите загрузить процессор и не видеть процессор, вы Вы также можете скрыть cpu от вашего JSON, используя:

protected $hidden = ['cpu'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...