Laravel атрибут не работает должным образом - PullRequest
0 голосов
/ 09 января 2020

В текущем приложении есть модель Part и модель Supplier. У каждой детали есть поставщик.

    public function supplier()
    {
        return $this->belongsTo(Supplier::class);
    }

Я добавил аксессор, чтобы получить имя поставщика.

Если я верну весь набор данных, я получу поставщика:

    public function getSupplierNameAttribute()
    {
        return $this->supplier;
    }
    "supplierName": {
        "id": 1,
        "uuid": "37e3a715-09d3-4fac-ae88-8f12e63fe79c",
        "name": "Laserteam",
        "street": "8602 Dessie Tunnel",
        "zip": "15869",
        "city": "New Clementview",
        "email_send_type": null,
        "active": 0,
        "created_at": "2020-01-09 09:46:02",
        "updated_at": "2020-01-09 09:46:02",
        "deleted_at": null,
        "action": "",
        "activeLabel": "<span class='badge badge-secondary'>Inaktiv<\/span>"
    },

Если я пытаюсь получить только имя (то, что мне нужно, наконец), возникает ошибка:

    public function getSupplierNameAttribute()
    {
        return $this->supplier->name;
    }
ErrorException: Trying to get property 'name' of non-object in file /gopanel/sites/7industry_net/public/7time/app/Models/Part/PartAttribute.php on line 48

Если я пытаюсь таким образом, это работает:

    public function getSupplierNameAttribute()
    {
        return $this->supplier['name'];
    }

Я не понимаю, почему return $this->supplier->name; не работает. Может кто-нибудь помочь?

Ответы [ 3 ]

1 голос
/ 09 января 2020

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

  1. Убедитесь, что у вас нет supplier в кастах для вашей модели
  2. Make уверен, что вы не используете supplier для имени столбца базы данных, или вы не делаете где-то что-то такое

    $this->supplier = $this->supplier->toArray();
    

Кажется, свойство supplier где-то становится массивом, поэтому одна нотация работает, а другой нет.

0 голосов
/ 09 января 2020

Я не совсем уверен, что там происходит; если у вас есть отношение supplier, то доступ к свойству должен lazy-загрузить отношение.

В качестве альтернативы вы можете попробовать этот синтаксис:

public function getSupplierNameAttribute()
{
    $this->loadMissing('supplier');

    return $this->getRelation('supplier')->name;
}

Однако , я бы не стал определять такие методы доступа. Это может привести к проблемам N + 1, если вы скажете, извлеките коллекцию деталей, а затем вызовите $part->supplier_name для каждой из них без необходимости загружать отношения supplier.

Лично, если я получаю доступ к атрибуции на отношениях, которые я предпочитаю делать через отношения (т. е. $part->supplier->name), поэтому мне показываются любые отношения, которые мне нужны для загрузки.

0 голосов
/ 09 января 2020

Попробуйте этот код

public function getSupplierNameAttribute()
{
    return $this->supplier->name ?? 'supplier not exists';
}
...