Dotazy typu Where LIKE v systému Laravel
Při práci s databázemi v Laravelu je jednou z nejčastějších potřeb vyhledávání záznamů pomocí příkazu SQL LIKE klauzule. To umožňuje provádět částečné shody - například vyhledat všechny uživatele, jejichž jména začínají na "John".
V tomto příspěvku prozkoumáme, jak používat where like dotazy v systému Laravel, jak to fungovalo před Laravelem 11 a 12 a co se v těchto novějších verzích změnilo. Budeme se také zabývat dotazy LIKE nerozlišující velká a malá písmena, dotazy LIKE s více sloupcia novější whereAny / whereAll / whereNone doložky.
Použití LIKE v Laravelu před verzemi 11 a 12
Před verzemi Laravel 11 a 12 bylo nutné použít příkaz where metoda s LIKE obsluha ručně:
// Find users whose names start with "John"$users = User::where('name', 'LIKE', 'John%')->get(); // Find users whose email contains "gmail"$users = User::where('email', 'LIKE', '%gmail%')->get();
Použití whereLike v Laravel 11 a 12
Z Laravel 11 a 12, Eloquent představil výraznější whereLike a orWhereLike syntaxe:
// Find users whose names start with "John"$users = User::whereLike('name', 'John%')->get(); // Find users whose email contains "gmail"$users = User::whereLike('email', '%gmail%')->get();
Dotazy LIKE nerozlišující velká a malá písmena
Rozlišování malých a velkých písmen u dotazů LIKE závisí na tom, zda je v databázi použita funkce collation. Například MySQL utf8mb4_unicode_ci sjednocení je rozlišování velkých a malých písmen ve výchozím nastavení.
Pokud chcete výslovně vynutit nerozlišuje velká a malá písmena jako dotazy, můžete použít LOWER():
// Case insensitive search for "john"$users = User::whereRaw('LOWER(name) LIKE ?', ['%john%'])->get();
Nebo ji zkombinujte s novou whereLike:
$users = User::whereLike(DB::raw('LOWER(name)'), '%john%')->get();
Dotazy LIKE na více sloupců
Někdy chcete hledat napříč více sloupců, jako je jméno or e-mail.
Před Laravelem 11 a 12:
$users = User::where('name', 'LIKE', '%john%') ->orWhere('email', 'LIKE', '%john%') ->get();
Od verze Laravel 11 a 12:
$users = User::whereAny(['name', 'email'], 'LIKE', '%john%')->get(); $users = User::whereAll(['name', 'email'], 'LIKE', '%john%')->get();
Souhrn
- Před Laravelem 11 a 12: Použijte
where('column', 'LIKE', 'pattern'). - Laravel 11 a 12+: Použijte
whereLikeaorWhereLikepro čistší syntaxi. - Nerozlišuje velká a malá písmena: Použijte
LOWER()s nezpracovanými dotazy, pokud se nerozlišují velká a malá písmena. - Více sloupců: Použijte
whereAny(['col1', 'col2'], 'LIKE' 'pattern'). - Pokročilé: Použijte
whereAny,whereAllawhereNonepro vícesloupcové dotazy LIKE s logikou OR, AND nebo NOT.