Databázové pomocníky
DatabaseDriver
DatabaseDriver modeluje drivery, pre ktoré balík môže potrebovať osobitnú vetvu. Postgres je zvyčajne výnimkou (natívny ILIKE, funkčné indexy), preto sa isPgsql() číta lepšie než porovnávanie magických reťazcov:
| Prípad | Názov drivera |
|---|---|
DatabaseDriver::Mariadb | mariadb |
DatabaseDriver::Mysql | mysql |
DatabaseDriver::Pgsql | pgsql |
DatabaseDriver::Sqlite | sqlite |
use Illuminate\Support\Facades\DB;
use RoundlyConsulting\PackageToolkit\Enums\DatabaseDriver;
// Boot / console / migration paths — may fail loudly:
if (DatabaseDriver::current()->isPgsql()) {
// Postgres-only branch
}
DatabaseDriver::current(DB::connection('reporting')); // a specific connection
// Request paths — degrade to the portable branch instead of throwing:
$isPgsql = DatabaseDriver::tryFrom($connection->getDriverName())?->isPgsql() ?? false;current() prečíta zadané spojenie — alebo predvolené — a pre driver, ktorý enum nemodeluje, vyhodí InvalidConfigurationException. Množina je zámerne uzavretá, kým tá v Laraveli nie (sqlsrv je oficiálny driver, ktorý enum neobsahuje). current() preto volajte len v boote, konzole a migráciách, kde smie zlyhať viditeľne. V ceste requestu použite tryFrom() s prenosnou záložnou vetvou, aby nemodelovaný engine prešiel na prenosné správanie namiesto toho, aby z funkčného endpointu urobil chybu 500.
whereLikeEscaped()
Vyhľadávanie podreťazca odolné voči injekcii, bezpečné aj pre surový vstup používateľa, ktoré funguje na každom databázovom driveri Laravelu. Zaregistrujte ho cez RegistersBlueprintMacros a máte ho k dispozícii v query aj Eloquent builderi:
use Illuminate\Support\Facades\DB;
// ILIKE on Postgres, LIKE on every other driver (sqlsrv included),
// with the user's % _ \ escaped via ESCAPE '\'.
DB::table('comments')->whereLikeEscaped('body', $term)->get(); // query builder
Comment::query()->whereLikeEscaped('body', $term)->get(); // Eloquent builder
// The third argument sets the boolean — combine matches with OR:
Comment::query()
->whereLikeEscaped('title', $term)
->whereLikeEscaped('body', $term, 'or')
->get();
// "%" stays literal: matches "he%lo there", not "hello world"
Comment::query()->whereLikeEscaped('body', '%lo')->get();- Zástupné znaky % a _ (aj escape znak \) z výrazu používateľa sa escapujú, takže hľadaný výraz nikdy nerozšíri zhodu nad doslovný podreťazec. Na SQL Serveri sa escapuje aj [, pretože T-SQL ho číta ako triedu znakov.
- Zhoda používa na každom driveri explicitnú klauzulu ESCAPE '\' — SQLite nemá predvolený escape znak, takže obyčajný LIKE by escapované zástupné znaky nechal aktívne.
- Postgres používa ILIKE, každý iný driver vrátane sqlsrv LIKE. Pre driver, ktorý enum DatabaseDriver nemodeluje, makro nikdy nevyhodí výnimku — použije prenosnú vetvu s LIKE.
- Nezávislosť od veľkosti písmen zabezpečuje na Postgrese ILIKE; inde závisí od enginu — LIKE v SQLite ignoruje veľkosť písmen len pri znakoch ASCII a MySQL, MariaDB a SQL Server sa riadia collation stĺpca (ich predvolené collation veľkosť písmen nerozlišujú).
- Stĺpec zadáva vývojár a gramatika ho obalí; hľadaný výraz aj escape znak sa viažu ako parametre — vstup používateľa sa nikdy nedostane na miesto identifikátora.
Bez makier
Tá istá logika je dostupná aj priamo: LikeSearch::apply() pridá klauzulu do ľubovoľného query buildera a LikeEscaper::escape() escapuje výraz pre ručne písanú klauzulu — vždy ho spojte s explicitnou klauzulou ESCAPE:
use Illuminate\Support\Facades\DB;
use RoundlyConsulting\PackageToolkit\Support\LikeEscaper;
use RoundlyConsulting\PackageToolkit\Support\LikeSearch;
// The same clause the macro adds, on any query builder:
LikeSearch::apply(DB::table('comments'), 'body', $term);
// Escape a term yourself (\, % and _) — always pair it with an explicit ESCAPE:
$needle = '%'.LikeEscaper::escape($term).'%';
DB::table('comments')->whereRaw('body like ? escape ?', [$needle, '\\']);Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.