Коли вам потрібна точна відповідність типів під час фільтрації колекцій, метод 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
дозволяє зберегти цілісність даних під час фільтрації, поважаючи повну ідентичність ваших значень та запобігаючи ненавмисному збігу при роботі з різними типами даних або введенням користувачів.