Точне фільтрування колекцій із використанням whereNotInStrict у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 26 березня, 2025
Вам коли-небудь доводилось стикатися з проблемами точного співпадіння типів під час фільтрації колекцій у Laravel? У нашій статті ми розглянемо, як метод whereNotInStrict допомагає точно виключати значення, забезпечуючи цілісність даних та уникаючи небажаних збігів. Читайте далі, щоб дізнатися більше

Коли вам потрібна точна відповідність типів під час фільтрації колекцій, метод Laravel whereNotInStrict забезпечує точні результати, адже він гарантує, що повинні відповідати як значення, так і типи під час виключення.

$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);

Використання whereNotInStrict дозволяє зберегти цілісність даних під час фільтрації, поважаючи повну ідентичність ваших значень та запобігаючи ненавмисному збігу при роботі з різними типами даних або введенням користувачів.