Сегодня бороздил просторы LinkedIn и наткнулся на вопрос:
`Can you spot the issue in this snippet?
$users = User::where('status', 'active')->get();
if ($users->count() > 0) { $users = $users->where('role', 'admin'); }
return view('users.index', compact('users'));
The code runs without errors, and the output even looks fine. But there’s a hidden conceptual problem here that could cause serious trouble in real-world projects.
Question: Where exactly is the problem, why is this approach risky, and what would be the correct way to fix it?
Автор радуется, что код работает без ошибок и даже «выглядит нормально», но на там есть ловушка. (Кстати найдете ли вы ее?. Можете в коментах рассказать)
❗️ Проблема в том, что после ->get() мы уже получаем Collection и фильтруем данные в памяти (Collection::where()), а не в базе (Builder::where()). На маленьком датасете всё выглядит красиво, а на проде с тысячами пользователей — вываливается лишняя нагрузка, лишнее потребление памяти и потеря ожидаемого поведения. И вот что интересно. С одной стороны, охуенный «тест на внимательность». Готов ли ты за джунами такую хуйню искать? С другой — не демонстрация ли это проблем в Eloquent и Collection?
Фреймворк гордится тем, что «очень простой и интуитивный», но именно эта простота рождает ситуации, где:
- джун легко спутает QueryBuilder и Collection
- визуально одинаковые методы (where) на самом деле делают принципиально разное
ошибка не выдаст exception, а тихо превратится в баг производительности.
Вопрос к вам: А для вас #Laravel все еще говно?`