Laravel9: Как подгрузить атрибут в выдачу результата (по запросу)?

Подскажите как можно включить по запросу, атрибут модели в результаты выдачи?
Для примера у модели, есть атрибут
protected function accessEdit(): Attribute
    {
        $user = auth()->user();
        return Attribute::make(
            get: function() use ($user) {
                return (bool) $user->hasAnyRole(['developer', 'admin']);
            }
        );
    }


Как подгрузить это свойство (атрибут) при работе с моделями понятно: $model->append('access_edit')
Если мне нужно добавить это свойство (атрибут) во все выдачи у данной модели, я в модели прописываю:
public $appends = ['access_edit'];
Но в моём случае это не корректно, мне не нужны эти атрибуты везде. У меня немного другая ситуация.

Я хочу включать это свойство (атрибут) в выборку, только по запросу. По аналогии со связями with() / load().
Т.е. что бы при состалении запроса, я мог указать, включать в выдачу мой атрибут или нет:
Model::where('props', true)->get();
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Из коробки такой возможности я не знаю. Но чисто теоретически можно:
1. Расширить Builder и Model добавив туда метод withProps по аналогии с методом with и при отдаче моделей в методе hydrate или чего еще - устраивать магию.
2. Перенести в sql через какой нибудь scope - если не сложные вычисления то select *, upper(name) as upper_name вполне норм.
3. Самое любимое закостылировать (и здесь пойдут слайды):
В модели прописать
public function getPropAttribute(): string
    {
        return 'prop';
    }

    public function newInstance($attributes = [], $exists = false)
    {
        $model = parent::newInstance($attributes, $exists);
        $model->setAppends($this->appends);

        return $model;
    }


Вызов запроса усложнится
(new \App\Models\User())->setAppends(['prop'])->newModelQuery()->get()->first()->toArray()

^ array:8 [
  "id" => 2
  "name" => "Алексеев Глеб Дмитриевич"
  "email" => "fmarkov@example.com"
  "email_verified_at" => "2022-06-16T02:18:03.000000Z"
  "deleted_at" => null
  "created_at" => "2022-06-16T02:18:03.000000Z"
  "updated_at" => "2022-06-16T02:18:03.000000Z"
  "prop" => "prop"
]


З.Ы. Однако не могу не отметить - что скорее всего вы куда то не туда свернули, может вы расскажите задачу целиком?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы