@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());
    }


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

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

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

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

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

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

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