Добавить аксессор по запросу

я пытаюсь иногда добавить мой Accessor к результату красноречивый запрос.

Вот мой аксессуар:

public function getCatAttribute() {
return "Here's a cat!";
}

Если я добавлю его, используя protected $appends = array('cat'); массив, он загружается просто отлично каждый раз.

Однако, удаляя это, поскольку я не хочу, чтобы это всегда добавляло это, я не могу заставить это загрузить это на красноречивый запрос.

Вот что я попробовал:

$items = Item::with('cat')->get();

Как мне этого добиться?

1

Решение

Я не знаю, понимаю ли я проблему, но вы можете создать аксессор для несуществующего атрибута. Если у вас есть cat атрибут, вы можете создать:

public function getModCatAttribute($value) {
if ($this->cat == 'dog') {
return "I'm a dog";
}
return $this->cat;
}

так что вы можете получить доступ сейчас $model->cat а также $model->mod_cat, Для общего использования этот метод лучше, потому что у вас всегда будет доступ к исходному свойству и к измененному, и вы всегда будете знать, какое из них изменено.

Но вы также можете сделать это следующим образом:

public function getCatAttribute($value) {
if ($this->cat == 'dog') {
return "I'm a dog";
}
return $this->cat;
}

И теперь вы можете получить доступ $model->cat и результат полагаться на то, что у вас есть внутри $cat приписывать.

1

Другие решения

РЕДАКТИРОВАТЬ:

ИМО единственный способ сделать это, расширить класс вашей модели и использовать $appends как вы уже упоминали. Так что-то вроде

class ModelWithCat extends MyModel
{
protected $appends = ['cat_attribute']
}

а затем назвать это как

ModelWithCat::get();

Ниже мой старый ответ для справки:

Я сортировал аналогичную проблему, в моем случае мне нужно было передать данные JSON из построителя запросов в таблицу Vue и преобразовать данные в бэкэнд, чтобы таблица Vue могла напрямую использовать данные. Мой код в контроллере выглядел так:

$query = Photo::query()->with(['user']);
if($filter) {
$query->where('title', 'like', "%{$filter}%")
}
return $query->orderBy($field, $dir)->paginate($limit)

Я не нашел способ вызвать средство доступа для коллекции, и я не мог просмотреть результаты класса Paginator. Наконец, я понял, что это возвращает JSON в конце, который я могу изменить перед отправкой в ​​Vue. Итак, я закончил что-то вроде этого:

// transform the data before return them
$res_json = $query->orderBy($field, $dir)->paginate($limit)->toJson();
$res_decoded = json_decode( $res_json );
foreach($res_decoded->data as $item) {
// transform the data.. you could probably call your accessor here like
// $item->cat = $item->cat , for me it was easier to just write the logic
// here instead
$item->license = 'dynamic-license';
}
return response()->json($res_decoded);

Я знаю, что это некрасиво, но это был единственный способ, который я нашел, и я использую его только в одном месте, поэтому я считаю, что должен с этим жить. Может быть, это кому-то поможет.

0