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!

Jonathan
la source
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();
Joël Larson
la source
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();
Yaroslav
la source
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.

dean grande
la source
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");
}
Myint Thu Lwin
la source
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'));
Sinan Eldem
la source