Раньше, если тебе нужно было искать строку сразу по нескольким полям, код превращался в лапшу из вложенных orWhere. Копипаст, который повторялся в каждом втором проекте. Теперь можно писать нормально, читабельно и без боли.

whereAny()

Допустим, нужно найти пользователя, если совпадает хотя бы одно поле: имя, фамилия, email или телефон.

Старый способ выглядел примерно так:

User::where(function ($query) use ($search) {
    $query->where('first_name', 'LIKE', "%$search%")
          ->orWhere('last_name', 'LIKE', "%$search%")
          ->orWhere('email', 'LIKE', "%$search%")
          ->orWhere('phone', 'LIKE', "%$search%");
});

Теперь это пишется в одну строку:

User::whereAny(
    ['first_name', 'last_name', 'email', 'phone'],
    'LIKE',
    "%$search%"
);

То же самое, только не надо городить вложенные функции и городить orWhere пачками.

whereAll()

Этот метод проверяет сразу по всем полям. Пример:

User::whereAll(
    ['first_name', 'last_name', 'email'],
    'LIKE',
    "%$search%"
);

Здесь запись попадёт в выборку только если условие совпадёт по каждому полю. Редкий случай, но бывает нужен: например, когда хочешь найти дубликаты или строгие совпадения по нескольким атрибутам сразу.

Когда это реально помогает

  • Поиск в админке: ввёл «Иван» — ищешь по имени, фамилии, email и телефону одновременно.
  • Универсальные фильтры: когда одно поле не спасает, а бизнес хочет «поиск везде».
  • Быстрые проверки дубликатов: например, надо убедиться, что у пользователя совпадает и email, и номер телефона.

Раньше писали кастомные скоупы, которые выглядели как каша. Теперь это встроено.

Заключение

whereAny() и whereAll() — не магия, а просто сахар, который избавляет от кучи копипаста и делает запросы читаемыми. Меньше лапши в коде = меньше поводов материться при ревью.