Utilisation d'Eloquent ORM dans Laravel pour effectuer une recherche dans la base de données à l'aide de LIKE


94

Je souhaite utiliser la création d'enregistrements actifs d'Eloquent pour créer une requête de recherche, mais ce sera une recherche LIKE. J'ai trouvé le User::find($term)ou User::find(1), mais cela ne génère pas une déclaration similaire. Je ne cherche pas une réponse directe, mais si quelqu'un pouvait au moins me donner une direction à regarder, ce serait génial!


2
laravel.com/docs/database/eloquent .. vous pouvez utiliser la documentation c'est très clair.
ytsejam

2
J'ai vu cette page, je n'ai rien vu sur la recherche avec des caractères génériques. Je ne voulais pas non plus mettre en place une expression régulière dans une boucle foreach car il y a des centaines de milliers de lignes
Jonathan

$ email = DB :: table ('users') -> where ('id', '=', 1) -> only ('email');
ytsejam

il est appelé générateur de requêtes fluent dans la documentation.
ytsejam

Si je pouvais marquer la réponse et votre commentaire comme réponse, je le ferais. Merci de m'avoir amené dans la bonne direction
Jonathan

Réponses:


235

Vous pouvez effectuer des recherches de base de données en utilisant LIKE avec cette syntaxe:

Model::where('column', 'LIKE', '%value%')->get();

1
pas si efficace, lance "Erreur fatale: niveau maximum d'imbrication de fonction de '100' atteint, abandon! en ..."
Sasi varna kumar

@gsk Je pense que vous rejoignez (en utilisant la méthode with ()) et que vous pouvez ensuite rechercher la colonne comme d'habitude. La syntaxe est probablement quelque chose comme table.field.
Anthony

64

Si vous avez besoin d'utiliser fréquemment LIKE, vous pouvez simplifier un peu le problème. Une méthode personnalisée comme () peut être créée dans le modèle qui hérite de l'ORM Eloquent:

public  function scopeLike($query, $field, $value){
        return $query->where($field, 'LIKE', "%$value%");
}

Vous pouvez donc utiliser cette méthode de cette manière:

User::like('name', 'Tomas')->get();

C'est la manière la plus «Laravel» de faire cela. C'est juste plus propre et vous permet d'ajuster la portée en un seul endroit, au lieu d'avoir à faire le tour et à ajuster chacun ->where().
Daniel Dewhurst

aime vraiment cette réponse. Cela rend le modèle et son utilisation très élégants, ce qui est l'essence même de laravel.
deathemperor

29

Pour info, la liste des opérateurs (contenant comme et tous les autres) est en code:

/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php

protected $operators = array(
    '=', '<', '>', '<=', '>=', '<>', '!=',
    'like', 'not like', 'between', 'ilike',
    '&', '|', '^', '<<', '>>',
    'rlike', 'regexp', 'not regexp',
);

avertissement:

La réponse de Joel Larson est correcte. J'ai mon vote favorable.

J'espère que cette réponse jettera plus de lumière sur ce qui est disponible via l'ORM Eloquent ( pointe les gens dans la bonne direction ). Alors qu'un lien vers la documentation serait bien meilleur, ce lien s'est avéré insaisissable.


18

Utilisez des guillemets doubles au lieu de guillemets simples, par exemple:

where('customer.name', 'LIKE', "%$findcustomer%")

Voici mon code:

public function searchCustomer($findcustomer)
{
    $customer = DB::table('customer')
                  ->where('customer.name', 'LIKE', "%$findcustomer%")
                  ->orWhere('customer.phone', 'LIKE', "%$findcustomer%")
                  ->get();

    return View::make("your view here");
}

3

Si vous n'aimez pas les guillemets doubles comme moi, cela fonctionnera pour vous avec des guillemets simples:

$value = Input::get('q');
$books = Book::where('name', 'LIKE', '%' . $value . '%')->limit(25)->get();

return view('pages/search/index', compact('books'));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.