это моя модель категории:
/**
* @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' в медиа-объекте категории
так что я могу сделать?
withDefault Йонаса здесь идеально подходит. В другом сценарии, когда это не совсем то, что вы хотите, просто переименуйте одно или другое - установите связь mediaRelationship или аксессуар getMediaWithDefaultAttribute или что-то в этом роде.






это не то, как работают аксессоры 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, он работает. в этом случае я установил его на объект отношения, я думаю, что это проблема
так что да, проблема в переопределении, попробуйте другое имя, как я уже упоминал, мутаторы переопределяют другие поля, я не знаю, как насчет аксессоров, я был на 100% уверен, что ваш синтаксис неправильный, мой плохой
я не могу этого сделать. потому что имя доступа должно существовать
Аксессуар может иметь любое имя, которое вы хотите, нет никакой разницы, назовете ли вы его getFooAttribute или getAasdsadadasAttribute, если вы помните это имя
когда я пытаюсь использовать другое имя, оно не отображается в объекте
попробуйте переименовать его в getFooAttribute, затем захватите один объект из запроса, например $item = Category::first();, а затем умрите его, как die($item->foo);, он должен вызвать этот аксессор
Я написал этот код, потому что хочу изменить медиа-объект, если он не имеет значения по умолчанию, например, «no-image.jpeg». как мне это сделать?
Вы можете использовать withDefault():
public function media()
{
return $this->belongsTo(Media::class)
->withDefault(['url' => '/products/default/thumb.jpg']);
}
Если результата нет, он возвращает экземпляр Media с заданными атрибутами.
Вы не можете иметь отношения
$this->mediaи аксессуара$this->mediaодновременно, как это. Одно будет преобладать над другим. (Я не помню, какой из них имеет приоритет.)