Bonjour à tous,

Je suis en apprentissage de Laravel et je rencontre un problème avec mon code.

En gros je dois faire une requete pour rechercher un mot dans ma DB.

Hors, si j'arrive effectivement à le faire sur une table, je dois aussi joindre une 2ème table pour afficher le titre le ta catégorie associée ainsi que l'icone.
Le problème c'est que j'ai beau chercher je ne vois pas trop comment faire.

Voici mon code pour mieux comprendre:

Le formulaire :

<form method="post" action="{{route('search')}}">
    @csrf
    <input type="text" name="search" id="tip_search_input" list="search" autocomplete=off required>
 </form>

La route :

// Route du formulaire de recherche
// Path :http://localhost/laravel-travail/public/search/ressource
   Route::post('search/ressource', 'formulairesController@search')->name('search');

Mon controler :

<?php

   namespace App\Http\Controllers;
   use App\Http\Models\Ressource as ressourcesMdl;
   use App\Http\Models\Categorie as categoriesMdl;
   use Illuminate\Http\Request;
   use Illuminate\Support\Facades\Input;
   use Illuminate\Support\Facades\DB;
   use Illuminate\Support\Facades\View;

   class formulairesController extends Controller {

      public function search(Request $request) {
            //Récupération de la chaine de caractère passée en get
           $mot_cle = Input::get('search');

           //Rechercher dans la table ressources les correspondances avec la chaine de caractère passée en get
           $ressources = DB::table('ressources')->where(function ($query) use ($mot_cle) {
              $query->orWhere('titre', 'like', "%".$mot_cle."%");
              $query->orWhere('texteAppercu', 'like', "%".$mot_cle."%");
              $query->orWhere('texteComplet', 'like', "%".$mot_cle."%");
            })->get();

            // Afficher les informations dans la vue
           return view('ressources.search', compact('ressources'));

      }

   }

Voila la requete SQL que je fais pour lier les 2 tables

SELECT
               ressources.id,
               ressources.titre,
               ressources.texteAppercu,
               ressources.image,
               ressources.slug,
               ressources.dateCreation,
               categories.icone as categIco,
               categories.titre as categTitre
            FROM
               categories,
               ressources
            WHERE
               categories.id=ressources.categorie_id
            ORDER BY
               ressources.dateCreation
            DESC

Bref, je mouline un peu pour trouver comment faire.

PS: j'aimerai aussi renvoyer le mot clé passé dans mon input pour l'afficher dans l'url des résultats, une idée de comment je peux faire ca ?

D'avance, un tout grand merci si une bonne âme charitable pourrait m'aider :)

3 réponses


Azorgh
Réponse acceptée

Hello,

Je te conseil de regarder du côté des relations de Laravel, soit directement sur la doc : https://laravel.com/docs/5.8/eloquent-relationships
Soit via les vidéos de Grafikart : https://www.grafikart.fr/tutoriels/eloquent-relations-610

L'utilisation de ce système va te permettre de pouvoir récupérer automatiquement tes relations (Ici, une ressource a 1 catégorie).

Si tu veux afficher le mot clé, pourquoi ne pas simplement passer ta route en GET ? Il s'agît d'un formulaire de recherche, donc du POST n'est pas nécessaire :)

LuciferX
Auteur

Merci, ca fonctionne impec maintenant.

Pour la route, je l'ai passé en get mais en faisant ca, j'ai aussi le token qui apparait dans l'url, hors je ne souhaite pas le voir.

Voici le patern d'url que j'obtiens :

http://localhost/laravel-projet/public/search/ressource?_token=G0a1QXid52PYPRzU5QzoP9yaA17fNmZTNU18dUkU&search=free

D'ailleurs, est-ce bien nécésaire d'utiliser un token pour un formulaire de recherche ? Car ce n'est jamais qu'un select dans la DB.

Merci ;-)

Sachant que c'est une route en GET, le token n'est clairement pas obligatoire. Tu peux donc l'enlever :)
Si il est ajouté automatiquement via un package "Form", tu peux te passer du plugin (ou alors peut être il existe une option à l'ouverture du form pour ne pas ajouter le token)