Метод whereValueBetween() перевіряє, чи знаходиться значення між двома колонками в базі даних. Цей метод, що використовується в запитах, дозволяє здійснювати порівняння, де одне значення має бути в межах, визначених парою колонок в одному рядку.
Раніше для перевірки, чи знаходиться значення між двома колонками, доводилося використовувати сирий SQL або об'єднувати кілька умов у запитах:
Post::whereRaw('? between "start_date" and "end_date"', now())->get();
Post::where('start_date', '<=', now())
->where('end_date', '>=', now())
->get();
Ці підходи працюють, але не відповідають патернам побудови запитів у Laravel і знижують читабельність коду.
Метод whereValueBetween() спрощує ці запити:
use App\Models\Campaign;
$active = Campaign::whereValueBetween(now(), ['start_date', 'end_date'])->get();
$userCampaigns = Campaign::where('user_id', auth()->id())
->whereValueBetween(now(), ['start_date', 'end_date'])
->where('status', 'active')
->get();
Приклад використання — у системах промоційного ціноутворення, де продукти мають знижки на обмежений час:
use App\Models\Product;
$discounted = Product::whereValueBetween(now(), ['discount_start', 'discount_end'])
->where('discount_active', true)
->get();
$categoryDeals = Product::where('category_id', $categoryId)
->whereValueBetween(now(), ['discount_start', 'discount_end'])
->orderBy('discount_percentage', 'desc')
->get();
Системи управління запасами можуть використовувати це для перевірки, чи кількість товару знаходиться в прийнятних межах:
use App\Models\InventoryItem;
$withinThresholds = InventoryItem::whereValueBetween(
$item->current_stock,
['min_threshold', 'max_threshold']
)->get();
Існує чотири методи для різних сценаріїв порівняння:
Product::whereValueBetween(100, ['min_price', 'max_price'])->get();
Product::orWhereValueBetween(150, ['min_price', 'max_price'])->get();
Product::whereValueNotBetween(100, ['min_price', 'max_price'])->get();
Product::orWhereValueNotBetween(150, ['min_price', 'max_price'])->get();
Цей метод працює в комбінації з іншими методами запитів для складного фільтрування:
use App\Models\Subscription;
$eligible = Subscription::where('tier', 'premium')
->whereValueBetween(auth()->user()->age, ['min_age', 'max_age'])
->where('region', $userRegion)
->get();
Запити на планування подій виграють завдяки цьому методу, коли потрібно перевірити, чи поточний час потрапляє в заплановані інтервали:
use App\Models\Event;
$happening = Event::whereValueBetween(now(), ['scheduled_start', 'scheduled_end'])
->where('venue_id', $venueId)
->get();
Метод whereValueBetween() замінює громіздку логіку умов єдиним викликом методу, який чітко висловлює намір перевірки діапазону. Він працює з будь-яким типом даних, що підтримують оператори порівняння у вашій базі даних