Laravel 5

Faire un foreach dans un modele...

  • Avatar de toto33347
    Membre depuis :
    05/06/2017
    Messages :
    13

    J'ai fait cette fonction dans mon modèle:

    public static function recherche2($search){
    $recherche = DB::table('sorties')
    ->select('*')
    ->join('categories','categories.id',"=","sorties.id_CATEGORIES");
    foreach ($search as $mot) {
    $recherche->where(function ($query) use ($mot){
    $query ->where('titre','LIKE','%'.$mot.'%')
    ->orWhere('description','LIKE','%'.$mot.'%')
    ->orWhere('nom','LIKE','%'.$mot.'%');
    });
    };
    $recherche->get();
    return $recherche;
    }

    Je lui envoie un array contenant une ou plusieurs expressions.
    Je veux faire en sorte que, pour chaque expression la requete fasse une recherche dans plusieurs champs.
    Je crois que c'est le "$recherche->" qui ne passe pas mais je n'ai pas trouvé la syntaxe adéquate pour faire ça...

    Donc j'ai besoin de votre aide pour m'aider à trouver la bonne syntaxe.

    Question subsidiaire: pensez-vous que ma requete est bonne dans le fond?
    J'ai un peu peur de m'embrouiller entre les OR et les AND...

    Merci bien :)

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    1644

    Salut,

    Le problème là est que tu fais des AND de tes recherches sur les mots et tu dois jamais avoir de résultat. En fait il faudrait cumuler des orWhere avec tes mots à rechercher, mais il faut commencer la recherche avec un where. Donc dans ton foreach il faudrait savoir quand tu as le premier mot, le plus simple est d'utiliser cette syntaxe :

    foreach ($search as $index => $mot) {
    ...
    }
  • Avatar de toto33347
    Membre depuis :
    05/06/2017
    Messages :
    13

    Tel quel, j'ai une erreur:

    htmlspecialchars() expects parameter 1 to be string, object given

    Je ne suis par certain d'avoir compris ce que tu as dit bestmomo, justement je veux des AND entre les mots et des OR sur chaque mot.
    Pour que chaque mot affine la recherche.

    De façon à ce que, si je tape "bonjour michel" j'ai les résultat qui contiennent "bonjour" soit dans la table "titre" soit dans la table "description" soit dans la table"titre" ET "michel" soit dans la table "titre" soit dans la table "description" soit dans la table"titre"

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    1644

    Ah ok j'avais pas bien compris, alors ta requête semble correcte. Tu as une erreur ? Ou alors tu n'obtiens pas le résultat souhaité ? Il faudrait voir la requête générée.

  • Avatar de toto33347
    Membre depuis :
    05/06/2017
    Messages :
    13

    J'ai essayé de remplacer

    $recherche->get();

    par

    ->toSql();
    dd($recherche)

    et il m'affiche

    Builder {#205 ▼
    +connection: MySqlConnection {#91 ▶}
    +grammar: MySqlGrammar {#92 ▶}
    +processor: MySqlProcessor {#93}
    +bindings: array:6 [▶]
    +aggregate: null
    +columns: array:1 [▶]
    +distinct: false
    +from: "sorties"
    +joins: array:1 [▶]
    +wheres: array:1 [▶]
    +groups: null
    +havings: null
    +orders: null
    +limit: null
    +offset: null
    +unions: null
    +unionLimit: null
    +unionOffset: null
    +unionOrders: null
    +lock: null
    +operators: array:29 [▶]
    +useWritePdo: false
    }

    Donc j'ai un problème avec ma syntaxe, il ne convertit pas en SQL...

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    1644

    Essaye :

    return $recherche->get();
  • Avatar de toto33347
    Membre depuis :
    05/06/2017
    Messages :
    13

    Maintenant j'ai un résultat... Bon j'ai le résultat en quadruple, et je viens de voir que tout est en double dans ma base (avec les id en double aussi...)

    Donc j'ai des tests à faire (notamment tester en local, vu que je suis sur cloud9 pour le moment)

    A suivre...

    En tout cas merci bestmomo pour m'avoir aidé à avancer <3

  • Avatar de stockhausen
    Membre depuis :
    05/11/2013
    Messages :
    32

    Bonjour,

    tu as un Trait qui est bien fait qui te permet de faire des recherches en définisant searchable dans ton model.

    https://github.com/nicolaslopezj/searchable

Vous ne pouvez pas répondre à ce sujet.