Laravel
February 23

Точная фильтрация коллекций в Laravel с помощью `whereNotInStrict`

Вам нужна точная фильтрация в коллекциях? Метод `whereNotInStrict` в Laravel обеспечивает строгую сравнительную фильтрацию, гарантируя точное совпадение типа и значения при исключении элементов.

Базовое использование

Фильтрация коллекций со строгой проверкой типов:

$collection = collect([
    ['id' => 1, 'value' => '100'],
    ['id' => 2, 'value' => 100],
    ['id' => 3, 'value' => '200'],
    ['id' => 4, 'value' => 200]
]);

// Обычная фильтрация (нестрогое сравнение)
$loose = $collection->whereNotIn('value', [100]);
// Результат: Только элементы со значением '200' и 200

// Строгая фильтрация (с учетом типа)
$strict = $collection->whereNotInStrict('value', [100]);
// Результат: Элементы со значениями '100', '200' и 200
// (оставляет строку '100', потому что 100 !== '100')

Реальный пример

Рассмотрим, как её можно использовать в системе фильтрации товаров:

class ProductFilter
{
  public function filterByExactStock($products, array $excludedStockLevels)
    {
        // Строгая фильтрация обеспечивает точное соответствие уровню запасов
        return $products->whereNotInStrict('stock_level', $excludedStockLevels);
    }
    
    public function filterByPreciseStatus($products, array $statuses)
    {
        return $products
            ->whereNotInStrict('status', $statuses)
            ->values();
    }
    
    public function applyFilters($products)
    {
        return $products
            // Исключение определенных цифровых кодов (с учетом типа)
            ->whereNotInStrict('product_code', ['001', '002'])
            // Исключение определенных строк состояния (с учетом типа)
            ->whereNotInStrict('status', ['active', 'pending'])
            // Переиндексация массива
            ->values();
    }
}

// Использование
$products = collect([
    ['product_code' => '001', 'status' => 'active'],
    ['product_code' => 1, 'status' => 'active'],    // Другой тип
    ['product_code' => '002', 'status' => 'pending'],
    ['product_code' => 2, 'status' => 'inactive']
]);

$filter = new ProductFilter();
$filtered = $filter->applyFilters($products);
// Сохраняются товары, product_code которых имеет числовое
// значение, а статус не равен 'active' или 'pending'.

Метод `whereNotInStrict` обеспечивает фильтрацию с учетом типов, когда требуется точный контроль над содержимым коллекции.