Laravel whereValueBetween для запитів у діапазоні значень колонок

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 04 жовтня, 2025
Ви хочете спростити свої запити в Laravel? Метод `whereValueBetween()` дозволяє легко перевіряти, чи знаходиться значення між двома значеннями у базі даних, що робить код більш зрозумілим та читабельним. Читайте далі, щоб дізнатися про переваги цього методу та його практичне застосування!

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