Dopyty a vyhľadávanie
Query scopy
HasTranslations pridáva tri scopy nad JSON cestou, ktoré fungujú na každej podporovanej databáze. Jazyk je predvolene jazyk aplikácie:
Topic::query()->whereLocale('name', 'Investing', 'en')->get(); // exact per-locale value (locale defaults to app locale)
Topic::query()->whereHasLocale('name', 'sk')->get(); // rows with a non-blank 'sk' value
Topic::query()->whereMissingLocale('name', 'sk')->get(); // rows missing 'sk' (feed an AI-fill queue)Každý scope overí, že pole je prekladateľné (inak NotATranslatableAttributeException), a skontroluje formát jazyka (InvalidLocaleException), takže jazyk z requestu sa do výrazu JSON cesty nikdy nedostane neoverený. Odovzdajte samotný názov atribútu: scopy aj Translatable::search() pred neho doplnia tabuľku modelu (topics.name->en), takže fungujú aj v dopyte s joinom na inú tabuľku so stĺpcom name. whereMissingLocale() sa prirodzene hodí k fronte na dopĺňanie prekladov:
Topic::query()
->whereMissingLocale('description', 'sk')
->each(fn (Topic $topic) => FillMissingTranslations::dispatch($topic, 'description'));Vyhľadávanie naprieč jazykmi
Translatable::search() pridá vyhľadávanie bez ohľadu na veľkosť písmen v jednom či viacerých poliach a vo všetkých podporovaných jazykoch — ilike na PostgreSQL, like nad malými písmenami na MySQL a SQLite:
use RoundlyConsulting\Translatable\DataTransferObjects\TranslationSearch;
use RoundlyConsulting\Translatable\Facades\Translatable;
$topics = Translatable::search(
Topic::query(),
new TranslationSearch(fields: ['name', 'description'], term: 'invest'),
)->get();
// The term is a literal substring — this matches "100%", not every row:
Translatable::search(Topic::query(), new TranslationSearch(fields: ['name'], term: '100%'))->get();Výraz sa berie ako doslovný podreťazec: %, _ a \ sa escapujú a SQL explicitne uvádza escape znak, takže hľadanie 100% alebo a_b nájde presne tieto riadky na každej databáze — vrátane SQLite, ktorá nemá predvolený escape znak pre LIKE. Hľadaný výraz sa vždy viaže ako parameter; do SQL sa dostane len názov poľa, overený ako obyčajný identifikátor. Vyhľadávanie bez polí (alebo bez podporovaného jazyka) nič nehľadá a nevráti žiadne riadky — nikdy nie všetky.
ilike na PostgreSQL a lower() na MySQL ignorujú veľkosť písmen aj pri znakoch s diakritikou, takže čaj nájde Čaj. Vstavaná funkcia lower() v SQLite prevádza na malé len písmená ASCII, preto tam nie — test vyhľadávania s diakritikou na SQLite tak nenájde zhody, ktoré PostgreSQL a MySQL nájdu.
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.