Аксессор для реляционных объектов в Laravel - PullRequest
0 голосов
/ 07 июня 2018

это моя модель категории:

/**
 * @var array
 */
protected $guarded = ['id'];


public function media()
{
    return $this->belongsTo(Media::class);
}

public function getMediaAttribute()
{
    return 'Foo';

    return ( ! is_null($this->media))
        ? $this->media
        : '/products/default/thumb.jpg';
}

, и когда я вызываю ее в маршруте для получения всего объекта, как это:

return \App\Category::with('media')->get();

кажется, что средство доступа не работает, и я могу 'получить 'Foo' в медиа-объекте категории

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы можете использовать withDefault():

public function media()
{
    return $this->belongsTo(Media::class)
        ->withDefault(['url' => '/products/default/thumb.jpg']);
}

Если результата нет, он возвращает экземпляр Media с заданными атрибутами.

0 голосов
/ 07 июня 2018

это не так, как работают аксессоры laravel

если вы создали его как

public function getMediaAttribute()
{
    return 'Foo';

    return ( ! is_null($this->media))
        ? $this->media
        : '/products/default/thumb.jpg';
}

, то вы получите к нему доступ как:

return \App\Category::first()->media;

он будет работать как 'дополнительное поле ', которым можно манипулировать различными способами для вашей модели, в данном случае для категории модели

дополнительная информация по этому вопросу: https://laravel.com/docs/5.6/eloquent-mutators#defining-an-accessor

также, как указано в комментарии под вашим вопросом, метод доступа с тем же именем, что и отношение, переопределит исходное поле с заданным именем, я не уверен на 100% в последней части о переопределении, вот как это работает с мутаторами, я думаю, что то же самое с аксессорами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...