Laravel 6

Comparer un slug à une string

Avatar de Wedd
Wedd

Bonjour à tous

Je m'arrache les cheveux depuis un petit moment sur le fait de pouvoir récupérer une entrée en DB en comparant un slug à une chaine. Je m'explique :) Dans ma DB, j'ai dans ma table customers avec plusieurs champs dont un champ qu'on appelera city qui est une chaine. Je vais avoir par exemple un customer dont la city sera 'Villeneuve d'Asq'.

Je cherche à récupérer les entrées dont la city sera: 'villeneuve-dasq'. Je ne souhaite pas créer un nouveau champ slug qui prendra cette valeur. Le but de cette demande et de pouvoir filtrer depuis une URL qui sera du type /customers/villeneuve-dasq.

Quelqu'un aurait une idée de comment faire cela ?

Merci par avance :) Bonne journée à tous

Avatar de JérômeBorg
JérômeBorg

Salut je n'ai pas bien compris, si ton input sera le slug ou le champ de la base, si le slug est stocké en base $villes = Customer::where('city','=',Str::slug($request->input('city'))->get(); cela devrait fonctionner

Avatar de Wedd
Wedd

Merci pour ta réponse. C'est l'inverse en réalité que je veux faire. J'ai dans ma base de données quelque chose comme ça:

id fullname city
46 Maurice DUPONT Villeneuve d'Asq

Et je voudrais qu'en ayant une url: https://monsite.fr/customer/{slug-ville} où slug-ville est égal à: villeneuve-dasq (généré via le Str::slug), je puisse récupérer la ou les entrées en DB.

Avatar de JérômeBorg
JérômeBorg

Si tu travaillais en anglais ce serait assez simple '-' ->' ', en faisant un selectRaw() tu pourrais faire des modifs dans ton champ city, mais en francais tu as toutes les correspondances de accent que choisir, même en faisant une regex entre éèê.... Franchement je ne vois pas, à part de dupliquer le champ city et city_slug Désolé

Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

Je lis que str_slug() est deprecated à partir de Laravel 6, donc je ne te conseille pas de l'utiliser. Tu peux toujours te baser sur un bon vieux urlencode()/urldecode();

Genre:

Route : $router->get('/customer/{slug-ville}', 'CustomerController@listVille')->name('customersville');

Blade : <a href="{{ route('customersville', urlencode($ville) )}}">{{ $ville }}</a>

Controller:

public function listVille($raw_ville){
    $ville = urldecode($raw_ville);
    Customer::where('city','=',$ville)->get();
    [...]
 }
Avatar de Wedd
Wedd

Merci à tous les deux pour vos messages. J'ai enfin trouvé une solution en m'inspirant de https://gist.github.com/matoakley/1092571. Je mets ma solution (surement perfectible) ici si quelqu'un rencontre le meme problème que moi un jour :)

return $query->whereRaw("LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TRIM(`" . $column . "`), ':', ''), ')', ''), '(', ''), ',', ''), '\\\', ''), '\/', ''), '\"', ''), '?', ''), '\'', ''), '&', ''), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-')) = ?", $slug);

Vous ne pouvez pas répondre à ce sujet.