Аксессор для объектов отношений в Laravel

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

/**
 * @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' в медиа-объекте категории

Вы не можете иметь отношения $this->media и аксессуара $this->media одновременно, как это. Одно будет преобладать над другим. (Я не помню, какой из них имеет приоритет.)

ceejayoz 06.06.2018 23:32

так что я могу сделать?

Sajjad 06.06.2018 23:37

withDefault Йонаса здесь идеально подходит. В другом сценарии, когда это не совсем то, что вы хотите, просто переименуйте одно или другое - установите связь mediaRelationship или аксессуар getMediaWithDefaultAttribute или что-то в этом роде.

ceejayoz 07.06.2018 00:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
1 271
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

это не то, как работают аксессоры 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%, что последняя часть о переопределении, вот как это работает с мутаторами, я думаю, что это то же самое с аксессуарами

НЕТ! когда я устанавливаю метод getTitleAttribute () для exmaple, он работает. в этом случае я установил его на объект отношения, я думаю, что это проблема

Sajjad 06.06.2018 23:37

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

stetoc 06.06.2018 23:38

я не могу этого сделать. потому что имя доступа должно существовать

Sajjad 06.06.2018 23:40

Аксессуар может иметь любое имя, которое вы хотите, нет никакой разницы, назовете ли вы его getFooAttribute или getAasdsadadasAttribute, если вы помните это имя

stetoc 06.06.2018 23:41

когда я пытаюсь использовать другое имя, оно не отображается в объекте

Sajjad 06.06.2018 23:47

попробуйте переименовать его в getFooAttribute, затем захватите один объект из запроса, например $item = Category::first();, а затем умрите его, как die($item->foo);, он должен вызвать этот аксессор

stetoc 06.06.2018 23:49

Я написал этот код, потому что хочу изменить медиа-объект, если он не имеет значения по умолчанию, например, «no-image.jpeg». как мне это сделать?

Sajjad 07.06.2018 00:04
Ответ принят как подходящий

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

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

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

Другие вопросы по теме