Équivalent Laravel-5 'LIKE' (Eloquent)

143

J'utilise le code ci-dessous pour extraire certains résultats de la base de données avec Laravel 5.

BookingDates::where('email', Input::get('email'))->orWhere('name', 'like', Input::get('name'))->get()

Cependant, orWhereLike ne semble correspondre à aucun résultat. Que produit ce code en termes d'instructions MySQL?

J'essaie de réaliser quelque chose comme ce qui suit:

select * from booking_dates where email='[email protected]' or name like '%John%'
V4n1ll4
la source

Réponses:

380

Si vous voulez voir ce qui est exécuté dans la base de données, utilisez dd(DB::getQueryLog())pour voir quelles requêtes ont été exécutées.

Essaye ça

BookingDates::where('email', Input::get('email'))
    ->orWhere('name', 'like', '%' . Input::get('name') . '%')->get();
Pawel Bieszczad
la source
35
cette injection SQL de requête est-elle protégée?
partho
23
@partho Oui. Laravel filtre la chaîne entière que vous passez comme troisième argument de la whereméthode.
Finesse
8
Lorsque l'injection est protégée, vous pouvez rechercher des% inattendus dans l'entrée utilisateur. Par exemple, LIKE "% John%" et LIKE "John%" fonctionnent différemment (vous pourriez seulement avoir l'intention de ce dernier). Considérez également une entrée vide, puis de "%" seul, ce qui pourrait également conduire à des résultats non intentionnels à partir du code ci-dessus.
Ian Fleeton
4
D'accord avec Ian. Laravel n'échappe que partiellement. Il y a encore beaucoup de mal possible si vous n'échappez pas correctement au LIKE. Voici comment: stackoverflow.com/a/42028380/329062
Greg
9
$data = DB::table('borrowers')
        ->join('loans', 'borrowers.id', '=', 'loans.borrower_id')
        ->select('borrowers.*', 'loans.*')   
        ->where('loan_officers', 'like', '%' . $officerId . '%')
        ->where('loans.maturity_date', '<', date("Y-m-d"))
        ->get();
sadiq rashid
la source
-> where ('pret_officers', 'like', '%'. $ officerId. '%') où credit_officers est le champ sérialisé
sadiq rashid
7

J'ai des perspectives pour cela, j'espère que cela aidera quelqu'un.

public function scopeWhereLike($query, $column, $value)
{
    return $query->where($column, 'like', '%'.$value.'%');
}

public function scopeOrWhereLike($query, $column, $value)
{
    return $query->orWhere($column, 'like', '%'.$value.'%');
}

Usage:

$result = BookingDates::whereLike('email', $email)->orWhereLike('name', $name)->get();
Oleg
la source