@Artem0071
Безработный mr. Junior

Model binding в Laravel?

В ларе есть встроенный route binding
Но есть ли такой же для обычных инжектов?

Есть пользователь, которого можно найти либо по айдишнику, либо по никнейму
В роуте это реализовано так:
Route::bind('user', static function ($value) {
            return Uuid::isValid($value)
                ? User::whereId($value)->firstOrFail()
                : User::whereNickname($value)->firstOrFail();
        });


Есть другие модули, в которых участвует пользователь
Так вот, для этих моделей есть скоупы:
public function scopeUser(Builder $query, $value): Builder
    {
        return $query->where(
            'user_id',
            '=',
            Uuid::isValid($value) ? $value : User::whereNickname($value)->firstOrFail()->getKey()
        );
    }


И такая байда из класса в класс

Можно было бы сделать так:
public function scopeUser(Builder $query, User $user): Builder
    {
        return $query->where('user_id', '=', $user->getKey());
    }


Но тут проблема в том что это либо никнейм либо айдишник. Можно ли как то где то прописать эти байнды как и для роутера это реализовано?
  • Вопрос задан
  • 436 просмотров
Решения вопроса 1
Sanasol
@Sanasol Куратор тега Laravel
нельзя просто так взять и загуглить ошибку
Как по мне лучший вариант сначала доставать юзера, а потом уже его использовать в скоупах и т.д.
Вместо того чтобы кидать в скоупы рандомную строку и пускай сам разбирается что с этим делать.
Сильно лучше никак не запилить, разве что whereHas приделать для большей читабельности.
И тогда н енадо будет заранее доставать юзера и лишнего запроса не будет в принципе делаться, хотя сам запрос с whereHas будет потяжелее.

И такая байда из класса в класс

Это лечится трейтом чтобы избежать дублирования кода.

В чем первоначальная проблема так и не понял.
В том что нужно как-то забиндить удобно или чтобы не делать в каждой модели scopeUser().

Так-то вообще можно придумать какой-то резольвер для биндов моделей, но судя по всему это как из пушки по воробьям.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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