Laravel-5 "LIKE" еквівалент (красномовний)


143

Я використовую наведений нижче код, щоб витягнути деякі результати з бази даних із Laravel 5.

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

Однак, схоже, результат orWhereLike не відповідає жодним результатам. Що створює цей код з точки зору висловлювань MySQL?

Я намагаюся досягти чогось такого:

select * from booking_dates where email='my@email.com' or name like '%John%'

Відповіді:


380

Якщо ви хочете побачити, що виконується в базі даних, використовуйте, dd(DB::getQueryLog())щоб побачити, які запити виконувались.

Спробуйте це

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

35
чи захищений цей введення sql введення?
partho

23
@partho Так. Laravel відображає цілу рядок, який ви передаєте як третій аргумент whereметоду.
Фінес

8
Незважаючи на захист від ін'єкцій, можливо, ви захочете перевірити на предмет несподіваних% введення користувачем. Наприклад, LIKE "% John%" та LIKE "John%" діють по-різному (ви можете мати намір лише останнє). Також врахуйте порожній введення, а потім лише "%", що також може призвести до ненавмисних результатів з вищевказаного коду.
Ян Флітон

4
Домовився з Іаном. Ларавель робить лише часткове втечу. Ще багато можливих пустощів можливе, якщо ви не належним чином уникнете LIKE Ось як: stackoverflow.com/a/42028380/329062
Грег,

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 rasid

7

У мене є сфери застосування для цього, сподіваюся, це комусь допоможе.

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

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

Використання:

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

5

Я думаю, що це краще, дотримуючись належних практик передачі параметрів запиту:

BookingDates::whereRaw('email = ? or name like ?', [$request->email,"%{$request->name}%"])->get();

Ви можете побачити це в документації, Laravel 5.5.

Ви також можете використовувати розвідника Laravel і полегшити пошук. Ось документація.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.