Comments 16
Не хватает ещё пары классов со скоупами типа isActive, которые будут прослойкой над методом whereActive. И вообще все части запросов билдера надо обязательно упаковывать в отдельные методы над методами и чем больше методов тем лучше.
Динамические where... по всем полям и так должны работать, например:
User::whereStatus(‘active’);
User::whereEmail(‘example@example.com’);
Поэтому обычно только специфичные добавляем.
Даже вроде всякие ->whereAgeGreaterThan(10) и тд. можно использовать, но это лучше проверить. Используем стандартный билдер.
Статья про SOLID, а не про билдер :)
Окей, но она вся построена на добавлении функции whereActive, которая и так по сути есть, просто называется whereIsActive.
Круто, конечно, что вы тут увидели какие-то принципы в коде, который не нужен).
Пример и правда плохой.
Но он не про изЭктив, а про то что сегодня это изЭктив, а завтра изЭктив+нотБаннед, поменяные в одном месте, а не в ста местах
Да, пример согласен, но статья полезная. Вот тоже хотел обратить внимание на фильтр. У нас они везде разные, например, мы не заносили в билдер. Бывает по одному и тому же полю надо немного по-другому фильтрануть. Это надо или уникальные названия каждый раз придумывать или нарушать ТЗ. Не знаю, может нарушает тот же SOLID.
На все эти вещи отлично подходит паттерн "спецификация"
Спасибо что прочитали статью!)
В примерах я также описал вариант с фильирами и другими подзрапросами. whereActive только для начального прмера чтобы люди уловили идею. Да магия laravel позволяет это писать и без кастомных билдеров. Но в крупных проектах иногда хочется держать всё в ручном режиме.
Да, идея понятна, спасибо, не придирался, просто хотел обратить внимание. У нас эти билдеры достаточно толстые сами по себе. Кастомить билдер намного удобнее чем добавлять where... или scope... в саму модель. Есть много других интересных примеров помимо фильтрации. Хотя и с фильтрацией бывает идут дальше, тот же Spatie Query Builder вообще работает от параметров запооса.
В ларке и так кругом магия, надо добавить магию над магией))
А чем не устроили скоупы, что понадобилось создание отдельного QueryBuilder?
Я ещё понимаю если бы расширили его возможности, но добавить туда что то намекающие на бизнес логику, это довольно дико.
Спасибо что прочитали статью!)
Да scope которые по дефольу есть работают хорошо, но сами понимаете в большое проекте магии laravel хочеться меньше, плюс scope могут работать медленее если посмотрите как они устроены. В примерах я показал как можно добавить фильтрацию и другие более сложные запросы. Все таки хочется больше ручногл управления.
В данных примерах нет бизнес логики, но и да писать там её не следуюет.
whereActive было бы бизнес логикой если бы было вот так:
public function whereActive()
{
return $this
->whereNotNull('email_verified_at')
->where('status', '!=', 'blocked')
->whereHas('subscription', fn ($q) => $q->valid());
}Т.е. само обозначение active. Конечно тогда такое лучше писать в других слоях приложения.
Тоже не люблю, когда в модели 100+ скоупов. Лежат отдельно в queryBuilder, но прям аж так заморачиваться...
Как навести порядок в запросах Laravel с помощью кастомных Query Builders