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();
  • Вопрос задан
  • 144 просмотра
Решения вопроса 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"
]


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

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

Войти через центр авторизации
Похожие вопросы