Laravel-5 эквивалент LIKE (красноречивый)


162

Я использую приведенный ниже код, чтобы получить некоторые результаты из базы данных с 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%'

Ответы:


401

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

Попробуй это

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

38
Защищен ли этот запрос sql-инъекцией?
partho

23
@partho Да. Laravel просматривает всю строку, которую вы передаете в качестве третьего аргумента whereметода.
Finesse

10
В то время как инъекция защищена, вы можете проверить неожиданный% в пользовательском вводе. Например, LIKE "% John%" и LIKE "John%" работают по-разному (вы можете иметь в виду только последнее). Также рассмотрите пустой ввод, а затем только "%", что также может привести к непредвиденным результатам из приведенного выше кода.
Ian Fleeton

4
Согласен с Яном. Laravel выполняет только частичное экранирование. Если вы не избежите ЛАЙКА должным образом, то все еще возможно множество неприятностей. Вот как это сделать: stackoverflow.com/a/42028380/329062
Грег,

Я добавил, preg_replace("/[^A-Za-z0-9 ]/", '', $search);потому что мне не нужны специальные символы, и он также защищает его от %инъекций
Хэйчоу,

12
$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();

-> где ('credit_officers', 'like', '%'. $ OfficId. '%'), где Credit_officers - это сериализованное поле,
sadiq rashid

10

У меня есть возможности для этого, надеюсь, это кому-нибудь поможет. https://laravel.com/docs/master/eloquent#local-scopes

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();

7

Я думаю, что это лучше, если следовать хорошей практике передачи параметров в запрос:

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

Вы можете увидеть это в документации Laravel 5.5.

Вы также можете использовать Laravel scout и упростить поиск. Вот документация.


Спасибо тебе за это.
Икенна Эмман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.