Использование Eloquent ORM в Laravel для выполнения поиска в базе данных с помощью LIKE

93

Я хочу использовать активное построение записей Eloquent для создания поискового запроса, но это будет поиск LIKE. Я нашел User::find($term)или User::find(1), но это не генерирует подобное утверждение. Я не ищу прямого ответа, но было бы здорово, если бы кто-нибудь дал мне хотя бы направление, куда я могу заглянуть!

Джонатан
источник
2
laravel.com/docs/database/eloquent .. вы можете использовать документацию, она очень ясна.
ytsejam
2
Я видел эту страницу, я просто ничего не видел о поиске с использованием подстановочных знаков. Я также не хотел настраивать регулярное выражение в цикле foreach, так как есть сотни тысяч строк
Джонатан
$ email = DB :: table ('users') -> where ('id', '=', 1) -> only ('email');
ytsejam
в документации он называется свободным построителем запросов.
ytsejam
Если бы я мог отметить ответ и ваш комментарий как ответ, я бы это сделал. Спасибо за то, что направили меня в правильном направлении
Джонатан,

Ответы:

234

Вы можете выполнять поиск в базе данных, используя LIKE, со следующим синтаксисом:

Model::where('column', 'LIKE', '%value%')->get();
Джоэл Ларсон
источник
1
не так эффективно, выдает «Неустранимая ошибка: достигнут максимальный уровень вложенности функций '100', прерывание! в ...»
Саси варна кумар
@gsk Я думаю, вы присоединяетесь (используя метод with ()), а затем можете искать столбец как обычно. Синтаксис наверное что-то вроде table.field.
Энтони
64

Если вам нужно часто использовать LIKE, вы можете немного упростить задачу. Пользовательский метод, такой как (), может быть создан в модели, наследующей Eloquent ORM:

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

Итак, вы можете использовать этот метод таким образом:

User::like('name', 'Tomas')->get();
Ярослав
источник
Это более «Laravel» способ сделать это. Это просто чище и позволяет настраивать прицел в одном месте, вместо того, чтобы ходить и настраивать каждое ->where().
Дэниел Дьюхерст,
очень люблю этот ответ. Это делает модель и ее использование очень элегантными, в чем и заключается суть laravel.
умерший император
29

FYI, список операторов (содержащий подобные и все остальные) находится в коде:

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

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

отказ от ответственности:

Ответ Джоэла Ларсона правильный. Получил свой голос

Я надеюсь, что этот ответ проливает больше света на то, что доступно через Eloquent ORM ( указывает на людей в правильном направлении ). Хотя ссылка на документацию была бы намного лучше, эта ссылка оказалась неуловимой.

Дин Гранде
источник
18

Используйте двойные кавычки вместо одинарных, например:

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

Ниже мой код:

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
источник
3

Если вам не нравятся двойные кавычки, как я, это сработает для вас с одинарными кавычками:

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

return view('pages/search/index', compact('books'));
Синан Элдем
источник