я пытаюсь иногда добавить мой Accessor к результату красноречивый запрос.
Вот мой аксессуар:
public function getCatAttribute() {
return "Here's a cat!";
}
Если я добавлю его, используя protected $appends = array('cat');
массив, он загружается просто отлично каждый раз.
Однако, удаляя это, поскольку я не хочу, чтобы это всегда добавляло это, я не могу заставить это загрузить это на красноречивый запрос.
Вот что я попробовал:
$items = Item::with('cat')->get();
Как мне этого добиться?
Я не знаю, понимаю ли я проблему, но вы можете создать аксессор для несуществующего атрибута. Если у вас есть 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
приписывать.
РЕДАКТИРОВАТЬ:
ИМО единственный способ сделать это, расширить класс вашей модели и использовать $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);
Я знаю, что это некрасиво, но это был единственный способ, который я нашел, и я использую его только в одном месте, поэтому я считаю, что должен с этим жить. Может быть, это кому-то поможет.